<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Interactive BOM for KiCAD</title>
  <style type="text/css">
:root {
  --pcb-edge-color: black;
  --pad-color: #878787;
  --pad-hole-color: #CCCCCC;
  --pad-color-highlight: #D04040;
  --pin1-outline-color: #ffb629;
  --pin1-outline-color-highlight: #b4ff03;
  --silkscreen-edge-color: #aa4;
  --silkscreen-polygon-color: #4aa;
  --silkscreen-text-color: #4aa;
  --fabrication-edge-color: #907651;
  --fabrication-polygon-color: #907651;
  --fabrication-text-color: #a27c24;
  --track-color: #def5f1;
  --track-color-highlight: #D04040;
  --zone-color: #def5f1;
  --zone-color-highlight: #d0404080;
}

html, body {
  margin: 0px;
  height: 100%;
  font-family: Verdana, sans-serif;
}

.dark.topmostdiv {
  --pcb-edge-color: #eee;
  --pad-color: #808080;
  --pin1-outline-color: #ffa800;
  --pin1-outline-color-highlight: #ccff00;
  --track-color: #42524f;
  --zone-color: #42524f;
  background-color: #252c30;
  color: #eee;
}

button {
  background-color: #eee;
  border: 1px solid #888;
  color: black;
  height: 44px;
  width: 44px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 14px;
  font-weight: bolder;
}

.dark button {
  /* This will be inverted */
  background-color: #c3b7b5;
}

button.depressed {
  background-color: #0a0;
  color: white;
}

.dark button.depressed {
  /* This will be inverted */
  background-color: #b3b;
}

button:focus {
  outline: 0;
}

button#tb-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#lr-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#bom-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-grouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-ungrouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-netlist-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}

button#copy {
  background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
  background-position: 6px 6px;
  background-repeat: no-repeat;
  background-size: 26px 26px;
  border-radius: 6px;
  height: 40px;
  width: 40px;
  margin: 10px 5px;
}

button#copy:active {
    box-shadow: inset 0px 0px 5px #6c6c6c;
}

textarea.clipboard-temp {
  position: fixed;
  top: 0;
  left: 0;
  width: 2em;
  height: 2em;
  padding: 0;
  border: None;
  outline: None;
  box-shadow: None;
  background: transparent;
}

.left-most-button {
  border-right: 0;
  border-top-left-radius: 6px;
  border-bottom-left-radius: 6px;
}

.middle-button {
  border-right: 0;
}

.right-most-button {
  border-top-right-radius: 6px;
  border-bottom-right-radius: 6px;
}

.button-container {
  font-size: 0;
  margin: 10px 10px 10px 0px;
}

.dark .button-container {
  filter: invert(1);
}

.button-container button {
  background-size: 32px 32px;
  background-position: 5px 5px;
  background-repeat: no-repeat;
}

@media print {
  .hideonprint {
    display: none;
  }
}

canvas {
  cursor: crosshair;
}

canvas:active {
  cursor: grabbing;
}

.fileinfo {
  width: 100%;
  max-width: 1000px;
  border: none;
  padding: 5px;
}

.fileinfo .title {
  font-size: 20pt;
  font-weight: bold;
}

.fileinfo td {
  overflow: hidden;
  white-space: nowrap;
  max-width: 1px;
  width: 50%;
  text-overflow: ellipsis;
}

.bom {
  border-collapse: collapse;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 10pt;
  table-layout: fixed;
  width: 100%;
  margin-top: 1px;
}

.bom th, .bom td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

.dark .bom th, .dark .bom td {
  border: 1px solid #777;
}

.bom th {
  background-color: #CCCCCC;
  background-clip: padding-box;
}

.dark .bom th {
  background-color: #3b4749;
}

.bom tr.highlighted:nth-child(n) {
  background-color: #cfc;
}

.dark .bom tr.highlighted:nth-child(n) {
  background-color: #226022;
}

.bom tr:nth-child(even) {
  background-color: #f2f2f2;
}

.dark .bom tr:nth-child(even) {
  background-color: #313b40;
}

.bom tr.checked {
  color: #aaa;
}

.dark .bom tr.checked {
  color: #666;
}

.bom tr {
  transition: background-color 0.2s;
}

.bom .numCol {
  width: 25px;
}

.bom .Description {
  width: 10%;
}

.bom .Part {
  width: 10%;
}

.bom .Value {
  width: 15%;
}

.bom .Quantity {
  width: 65px;
}

.bom th .sortmark {
  position: absolute;
  right: 1px;
  top: 1px;
  margin-top: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent transparent #221 transparent;
  transform-origin: 50% 85%;
  transition: opacity 0.2s, transform 0.4s;
}

.dark .bom th .sortmark {
  filter: invert(1);
}

.bom th .sortmark.none {
  opacity: 0;
}

.bom th .sortmark.desc {
  transform: rotate(180deg);
}

.bom th:hover .sortmark.none {
  opacity: 0.5;
}

.bom .bom-checkbox {
  width: 30px;
  position: relative;
  user-select: none;
  -moz-user-select: none;
}

.bom .bom-checkbox:before {
  content: "";
  position: absolute;
  border-width: 15px;
  border-style: solid;
  border-color: #51829f transparent transparent transparent;
  visibility: hidden;
  top: -15px;
}

.bom .bom-checkbox:after {
  content: "Double click to set/unset all";
  position: absolute;
  color: white;
  top: -35px;
  left: -26px;
  background: #51829f;
  padding: 5px 15px;
  border-radius: 8px;
  white-space: nowrap;
  visibility: hidden;
}

.bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after {
  visibility: visible;
  transition: visibility 0.2s linear 1s;
}

.split {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  overflow-y: auto;
  overflow-x: hidden;
  background-color: inherit;
}

.split.split-horizontal, .gutter.gutter-horizontal {
  height: 100%;
  float: left;
}

.gutter {
  background-color: #ddd;
  background-repeat: no-repeat;
  background-position: 50%;
  transition: background-color 0.3s;
}

.dark .gutter {
  background-color: #777;
}

.gutter.gutter-horizontal {
  background-image: url('');
  cursor: ew-resize;
  width: 5px;
}

.gutter.gutter-vertical {
  background-image: url('');
  cursor: ns-resize;
  height: 5px;
}

.searchbox {
  float: left;
  height: 40px;
  margin: 10px 5px;
  padding: 12px 32px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 18px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 6px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  background-image: url('');
  background-position: 10px 10px;
  background-repeat: no-repeat;
}

.dark .searchbox {
  background-color: #111;
  color: #eee;
}

.searchbox::placeholder {
  color: #ccc;
}

.dark .searchbox::placeholder {
  color: #666;
}

.filter {
  width: calc(60% - 64px);
}

.reflookup {
  width: calc(40% - 10px);
}

input[type=text]:focus {
  background-color: white;
  border: 1px solid #333;
}

.dark input[type=text]:focus {
  background-color: #333;
  border: 1px solid #ccc;
}

mark.highlight {
  background-color: #5050ff;
  color: #fff;
  padding: 2px;
  border-radius: 6px;
}

.dark mark.highlight {
  background-color: #76a6da;
  color: #111;
}

.menubtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
  background-position: center;
  background-repeat: no-repeat;
}

.statsbtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.iobtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
  filter: invert(1);
}

.flexbox {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
}

.savebtn {
  background-color: #d6d6d6;
  width: auto;
  height: 30px;
  flex-grow: 1;
  margin: 5px;
  border-radius: 4px;
}

.savebtn:active {
  background-color: #0a0;
  color: white;
}

.dark .savebtn:active {
  /* This will be inverted */
  background-color: #b3b;
}

.stats {
  border-collapse: collapse;
  font-size: 12pt;
  table-layout: fixed;
  width: 100%;
  min-width: 450px;
}

.dark .stats td {
  border: 1px solid #bbb;
}

.stats td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

#checkbox-stats div {
  position: absolute;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

#checkbox-stats .bar {
  background-color: rgba(28, 251, 0, 0.6);
}

.menu {
  position: relative;
  display: inline-block;
  margin: 10px 10px 10px 0px;
}

.menu-content {
  display: none;
  position: absolute;
  background-color: white;
  right: 0;
  min-width: 300px;
  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  z-index: 100;
  padding: 8px;
}

.dark .menu-content {
  background-color: #111;
}

.menu:hover .menu-content {
  display: block;
}

.menu:hover .menubtn, .menu:hover .iobtn, .menu:hover .statsbtn {
  background-color: #eee;
}

.menu-label {
  display: inline-block;
  padding: 8px;
  border: 1px solid #ccc;
  border-top: 0;
  width: calc(100% - 18px);
}

.menu-label-top {
  border-top: 1px solid #ccc;
}

.menu-textbox {
  float: left;
  height: 24px;
  margin: 10px 5px;
  padding: 5px 5px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 14px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 4px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  width: calc(100% - 10px);
}

.menu-textbox.invalid, .dark .menu-textbox.invalid {
  color: red;
}

.dark .menu-textbox {
  background-color: #222;
  color: #eee;
}

.radio-container {
  margin: 4px;
}

.topmostdiv {
  width: 100%;
  height: 100%;
  background-color: white;
  transition: background-color 0.3s;
}

#top {
  height: 78px;
  border-bottom: 2px solid black;
}

.dark #top {
  border-bottom: 2px solid #ccc;
}

#dbg {
  display: block;
}

::-webkit-scrollbar {
  width: 8px;
}

::-webkit-scrollbar-track {
  background: #aaa;
}

::-webkit-scrollbar-thumb {
  background: #666;
  border-radius: 3px;
}

::-webkit-scrollbar-thumb:hover {
  background: #555;
}

.slider {
  -webkit-appearance: none;
  width: 100%;
  margin: 3px 0;
  padding: 0;
  outline: none;
  opacity: 0.7;
  -webkit-transition: .2s;
  transition: opacity .2s;
  border-radius: 3px;
}

.slider:hover {
  opacity: 1;
}

.slider:focus {
  outline: none;
}

.slider::-webkit-slider-runnable-track {
  -webkit-appearance: none;
  width: 100%;
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
  border: none;
}

.slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin-top: -4px;
}

.dark .slider::-webkit-slider-thumb {
  background: #3d3;
}

.slider::-moz-range-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
}

.slider::-moz-range-track {
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
}

.dark .slider::-moz-range-thumb {
  background: #3d3;
}

.slider::-ms-track {
  width: 100%;
  height: 8px;
  border-width: 3px 0;
  background: transparent;
  border-color: transparent;
  color: transparent;
  transition: opacity .2s;
}

.slider::-ms-fill-lower {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-fill-upper {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin: 0;
}

.shameless-plug {
  font-size: 0.8em;
  text-align: center;
  display: block;
}

a {
  color: #0278a4;
}

.dark a {
  color: #00b9fd;
}

#frontcanvas, #backcanvas {
    touch-action: none;
}

 
  </style>
  <script type="text/javascript" >
///////////////////////////////////////////////
/*
  Split.js - v1.3.5
  MIT License
  https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});

///////////////////////////////////////////////

///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////

///////////////////////////////////////////////
/*!
 * PEP v0.4.3 | https://github.com/jquery/PEP
 * Copyright jQuery Foundation and other contributors | http://jquery.org/license
 */
! function (a, b) {
  "object" == typeof exports && "undefined" != typeof module ? module.exports = b() : "function" == typeof define && define.amd ? define(b) : a.PointerEventsPolyfill = b()
}(this, function () {
  "use strict";

  function a(a, b) {
    b = b || Object.create(null);
    var c = document.createEvent("Event");
    c.initEvent(a, b.bubbles || !1, b.cancelable || !1);
    for (var d, e = 2; e < m.length; e++) d = m[e], c[d] = b[d] || n[e];
    c.buttons = b.buttons || 0;
    var f = 0;
    return f = b.pressure && c.buttons ? b.pressure : c.buttons ? .5 : 0, c.x = c.clientX, c.y = c.clientY, c.pointerId = b.pointerId || 0, c.width = b.width || 0, c.height = b.height || 0, c.pressure = f, c.tiltX = b.tiltX || 0, c.tiltY = b.tiltY || 0, c.twist = b.twist || 0, c.tangentialPressure = b.tangentialPressure || 0, c.pointerType = b.pointerType || "", c.hwTimestamp = b.hwTimestamp || 0, c.isPrimary = b.isPrimary || !1, c
  }

  function b() {
    this.array = [], this.size = 0
  }

  function c(a, b, c, d) {
    this.addCallback = a.bind(d), this.removeCallback = b.bind(d), this.changedCallback = c.bind(d), A && (this.observer = new A(this.mutationWatcher.bind(this)))
  }

  function d(a) {
    return "body /shadow-deep/ " + e(a)
  }

  function e(a) {
    return '[touch-action="' + a + '"]'
  }

  function f(a) {
    return "{ -ms-touch-action: " + a + "; touch-action: " + a + "; }"
  }

  function g() {
    if (F) {
      D.forEach(function (a) {
        String(a) === a ? (E += e(a) + f(a) + "\n", G && (E += d(a) + f(a) + "\n")) : (E += a.selectors.map(e) + f(a.rule) + "\n", G && (E += a.selectors.map(d) + f(a.rule) + "\n"))
      });
      var a = document.createElement("style");
      a.textContent = E, document.head.appendChild(a)
    }
  }

  function h() {
    if (!window.PointerEvent) {
      if (window.PointerEvent = a, window.navigator.msPointerEnabled) {
        var b = window.navigator.msMaxTouchPoints;
        Object.defineProperty(window.navigator, "maxTouchPoints", {
          value: b,
          enumerable: !0
        }), u.registerSource("ms", _)
      } else Object.defineProperty(window.navigator, "maxTouchPoints", {
        value: 0,
        enumerable: !0
      }), u.registerSource("mouse", N), void 0 !== window.ontouchstart && u.registerSource("touch", V);
      u.register(document)
    }
  }

  function i(a) {
    if (!u.pointermap.has(a)) {
      var b = new Error("InvalidPointerId");
      throw b.name = "InvalidPointerId", b
    }
  }

  function j(a) {
    for (var b = a.parentNode; b && b !== a.ownerDocument;) b = b.parentNode;
    if (!b) {
      var c = new Error("InvalidStateError");
      throw c.name = "InvalidStateError", c
    }
  }

  function k(a) {
    var b = u.pointermap.get(a);
    return 0 !== b.buttons
  }

  function l() {
    window.Element && !Element.prototype.setPointerCapture && Object.defineProperties(Element.prototype, {
      setPointerCapture: {
        value: W
      },
      releasePointerCapture: {
        value: X
      },
      hasPointerCapture: {
        value: Y
      }
    })
  }
  var m = ["bubbles", "cancelable", "view", "detail", "screenX", "screenY", "clientX", "clientY", "ctrlKey", "altKey", "shiftKey", "metaKey", "button", "relatedTarget", "pageX", "pageY"],
    n = [!1, !1, null, null, 0, 0, 0, 0, !1, !1, !1, !1, 0, null, 0, 0],
    o = window.Map && window.Map.prototype.forEach,
    p = o ? Map : b;
  b.prototype = {
    set: function (a, b) {
      return void 0 === b ? this["delete"](a) : (this.has(a) || this.size++, void(this.array[a] = b))
    },
    has: function (a) {
      return void 0 !== this.array[a]
    },
    "delete": function (a) {
      this.has(a) && (delete this.array[a], this.size--)
    },
    get: function (a) {
      return this.array[a]
    },
    clear: function () {
      this.array.length = 0, this.size = 0
    },
    forEach: function (a, b) {
      return this.array.forEach(function (c, d) {
        a.call(b, c, d, this)
      }, this)
    }
  };
  var q = ["bubbles", "cancelable", "view", "detail", "screenX", "screenY", "clientX", "clientY", "ctrlKey", "altKey", "shiftKey", "metaKey", "button", "relatedTarget", "buttons", "pointerId", "width", "height", "pressure", "tiltX", "tiltY", "pointerType", "hwTimestamp", "isPrimary", "type", "target", "currentTarget", "which", "pageX", "pageY", "timeStamp"],
    r = [!1, !1, null, null, 0, 0, 0, 0, !1, !1, !1, !1, 0, null, 0, 0, 0, 0, 0, 0, 0, "", 0, !1, "", null, null, 0, 0, 0, 0],
    s = {
      pointerover: 1,
      pointerout: 1,
      pointerenter: 1,
      pointerleave: 1
    },
    t = "undefined" != typeof SVGElementInstance,
    u = {
      pointermap: new p,
      eventMap: Object.create(null),
      captureInfo: Object.create(null),
      eventSources: Object.create(null),
      eventSourceList: [],
      registerSource: function (a, b) {
        var c = b,
          d = c.events;
        d && (d.forEach(function (a) {
          c[a] && (this.eventMap[a] = c[a].bind(c))
        }, this), this.eventSources[a] = c, this.eventSourceList.push(c))
      },
      register: function (a) {
        for (var b, c = this.eventSourceList.length, d = 0; d < c && (b = this.eventSourceList[d]); d++)
          b.register.call(b, a)
      },
      unregister: function (a) {
        for (var b, c = this.eventSourceList.length, d = 0; d < c && (b = this.eventSourceList[d]); d++)
          b.unregister.call(b, a)
      },
      contains: function (a, b) {
        try {
          return a.contains(b)
        } catch (c) {
          return !1
        }
      },
      down: function (a) {
        a.bubbles = !0, this.fireEvent("pointerdown", a)
      },
      move: function (a) {
        a.bubbles = !0, this.fireEvent("pointermove", a)
      },
      up: function (a) {
        a.bubbles = !0, this.fireEvent("pointerup", a)
      },
      enter: function (a) {
        a.bubbles = !1, this.fireEvent("pointerenter", a)
      },
      leave: function (a) {
        a.bubbles = !1, this.fireEvent("pointerleave", a)
      },
      over: function (a) {
        a.bubbles = !0, this.fireEvent("pointerover", a)
      },
      out: function (a) {
        a.bubbles = !0, this.fireEvent("pointerout", a)
      },
      cancel: function (a) {
        a.bubbles = !0, this.fireEvent("pointercancel", a)
      },
      leaveOut: function (a) {
        this.out(a), this.propagate(a, this.leave, !1)
      },
      enterOver: function (a) {
        this.over(a), this.propagate(a, this.enter, !0)
      },
      eventHandler: function (a) {
        if (!a._handledByPE) {
          var b = a.type,
            c = this.eventMap && this.eventMap[b];
          c && c(a), a._handledByPE = !0
        }
      },
      listen: function (a, b) {
        b.forEach(function (b) {
          this.addEvent(a, b)
        }, this)
      },
      unlisten: function (a, b) {
        b.forEach(function (b) {
          this.removeEvent(a, b)
        }, this)
      },
      addEvent: function (a, b) {
        a.addEventListener(b, this.boundHandler)
      },
      removeEvent: function (a, b) {
        a.removeEventListener(b, this.boundHandler)
      },
      makeEvent: function (b, c) {
        this.captureInfo[c.pointerId] && (c.relatedTarget = null);
        var d = new a(b, c);
        return c.preventDefault && (d.preventDefault = c.preventDefault), d._target = d._target || c.target, d
      },
      fireEvent: function (a, b) {
        var c = this.makeEvent(a, b);
        return this.dispatchEvent(c)
      },
      cloneEvent: function (a) {
        for (var b, c = Object.create(null), d = 0; d < q.length; d++) b = q[d], c[b] = a[b] || r[d], !t || "target" !== b && "relatedTarget" !== b || c[b] instanceof SVGElementInstance && (c[b] = c[b].correspondingUseElement);
        return a.preventDefault && (c.preventDefault = function () {
          a.preventDefault()
        }), c
      },
      getTarget: function (a) {
        var b = this.captureInfo[a.pointerId];
        return b ? a._target !== b && a.type in s ? void 0 : b : a._target
      },
      propagate: function (a, b, c) {
        for (var d = a.target, e = []; d !== document && !d.contains(a.relatedTarget);)
          if (e.push(d), d = d.parentNode, !d) return;
        c && e.reverse(), e.forEach(function (c) {
          a.target = c, b.call(this, a)
        }, this)
      },
      setCapture: function (b, c, d) {
        this.captureInfo[b] && this.releaseCapture(b, d), this.captureInfo[b] = c, this.implicitRelease = this.releaseCapture.bind(this, b, d), document.addEventListener("pointerup", this.implicitRelease), document.addEventListener("pointercancel", this.implicitRelease);
        var e = new a("gotpointercapture");
        e.pointerId = b, e._target = c, d || this.asyncDispatchEvent(e)
      },
      releaseCapture: function (b, c) {
        var d = this.captureInfo[b];
        if (d) {
          this.captureInfo[b] = void 0, document.removeEventListener("pointerup", this.implicitRelease), document.removeEventListener("pointercancel", this.implicitRelease);
          var e = new a("lostpointercapture");
          e.pointerId = b, e._target = d, c || this.asyncDispatchEvent(e)
        }
      },
      dispatchEvent: /*scope.external.dispatchEvent || */ function (a) {
        var b = this.getTarget(a);
        if (b) return b.dispatchEvent(a)
      },
      asyncDispatchEvent: function (a) {
        requestAnimationFrame(this.dispatchEvent.bind(this, a))
      }
    };
  u.boundHandler = u.eventHandler.bind(u);
  var v = {
      shadow: function (a) {
        if (a) return a.shadowRoot || a.webkitShadowRoot
      },
      canTarget: function (a) {
        return a && Boolean(a.elementFromPoint)
      },
      targetingShadow: function (a) {
        var b = this.shadow(a);
        if (this.canTarget(b)) return b
      },
      olderShadow: function (a) {
        var b = a.olderShadowRoot;
        if (!b) {
          var c = a.querySelector("shadow");
          c && (b = c.olderShadowRoot)
        }
        return b
      },
      allShadows: function (a) {
        for (var b = [], c = this.shadow(a); c;) b.push(c), c = this.olderShadow(c);
        return b
      },
      searchRoot: function (a, b, c) {
        if (a) {
          var d, e, f = a.elementFromPoint(b, c);
          for (e = this.targetingShadow(f); e;) {
            if (d = e.elementFromPoint(b, c)) {
              var g = this.targetingShadow(d);
              return this.searchRoot(g, b, c) || d
            }
            e = this.olderShadow(e)
          }
          return f
        }
      },
      owner: function (a) {
        for (var b = a; b.parentNode;) b = b.parentNode;
        return b.nodeType !== Node.DOCUMENT_NODE && b.nodeType !== Node.DOCUMENT_FRAGMENT_NODE && (b = document), b
      },
      findTarget: function (a) {
        var b = a.clientX,
          c = a.clientY,
          d = this.owner(a.target);
        return d.elementFromPoint(b, c) || (d = document), this.searchRoot(d, b, c)
      }
    },
    w = Array.prototype.forEach.call.bind(Array.prototype.forEach),
    x = Array.prototype.map.call.bind(Array.prototype.map),
    y = Array.prototype.slice.call.bind(Array.prototype.slice),
    z = Array.prototype.filter.call.bind(Array.prototype.filter),
    A = window.MutationObserver || window.WebKitMutationObserver,
    B = "[touch-action]",
    C = {
      subtree: !0,
      childList: !0,
      attributes: !0,
      attributeOldValue: !0,
      attributeFilter: ["touch-action"]
    };
  c.prototype = {
    watchSubtree: function (a) {
      //
      this.observer && v.canTarget(a) && this.observer.observe(a, C)
    },
    enableOnSubtree: function (a) {
      this.watchSubtree(a), a === document && "complete" !== document.readyState ? this.installOnLoad() : this.installNewSubtree(a)
    },
    installNewSubtree: function (a) {
      w(this.findElements(a), this.addElement, this)
    },
    findElements: function (a) {
      return a.querySelectorAll ? a.querySelectorAll(B) : []
    },
    removeElement: function (a) {
      this.removeCallback(a)
    },
    addElement: function (a) {
      this.addCallback(a)
    },
    elementChanged: function (a, b) {
      this.changedCallback(a, b)
    },
    concatLists: function (a, b) {
      return a.concat(y(b))
    },
    installOnLoad: function () {
      document.addEventListener("readystatechange", function () {
        "complete" === document.readyState && this.installNewSubtree(document)
      }.bind(this))
    },
    isElement: function (a) {
      return a.nodeType === Node.ELEMENT_NODE
    },
    flattenMutationTree: function (a) {
      var b = x(a, this.findElements, this);
      return b.push(z(a, this.isElement)), b.reduce(this.concatLists, [])
    },
    mutationWatcher: function (a) {
      a.forEach(this.mutationHandler, this)
    },
    mutationHandler: function (a) {
      if ("childList" === a.type) {
        var b = this.flattenMutationTree(a.addedNodes);
        b.forEach(this.addElement, this);
        var c = this.flattenMutationTree(a.removedNodes);
        c.forEach(this.removeElement, this)
      } else "attributes" === a.type && this.elementChanged(a.target, a.oldValue)
    }
  };
  var D = ["none", "auto", "pan-x", "pan-y", {
      rule: "pan-x pan-y",
      selectors: ["pan-x pan-y", "pan-y pan-x"]
    }],
    E = "",
    F = window.PointerEvent || window.MSPointerEvent,
    G = !window.ShadowDOMPolyfill && document.head.createShadowRoot,
    H = u.pointermap,
    I = 25,
    J = [1, 4, 2, 8, 16],
    K = !1;
  try {
    K = 1 === new MouseEvent("test", {
      buttons: 1
    }).buttons
  } catch (L) {}
  var M, N = {
      POINTER_ID: 1,
      POINTER_TYPE: "mouse",
      events: ["mousedown", "mousemove", "mouseup", "mouseover", "mouseout"],
      register: function (a) {
        u.listen(a, this.events)
      },
      unregister: function (a) {
        u.unlisten(a, this.events)
      },
      lastTouches: [],
      isEventSimulatedFromTouch: function (a) {
        for (var b, c = this.lastTouches, d = a.clientX, e = a.clientY, f = 0, g = c.length; f < g && (b = c[f]); f++) {
          var h = Math.abs(d - b.x),
            i = Math.abs(e - b.y);
          if (h <= I && i <= I) return !0
        }
      },
      prepareEvent: function (a) {
        var b = u.cloneEvent(a),
          c = b.preventDefault;
        return b.preventDefault = function () {
          a.preventDefault(), c()
        }, b.pointerId = this.POINTER_ID, b.isPrimary = !0, b.pointerType = this.POINTER_TYPE, b
      },
      prepareButtonsForMove: function (a, b) {
        var c = H.get(this.POINTER_ID);
        0 !== b.which && c ? a.buttons = c.buttons : a.buttons = 0, b.buttons = a.buttons
      },
      mousedown: function (a) {
        if (!this.isEventSimulatedFromTouch(a)) {
          var b = H.get(this.POINTER_ID),
            c = this.prepareEvent(a);
          K || (c.buttons = J[c.button], b && (c.buttons |= b.buttons), a.buttons = c.buttons), H.set(this.POINTER_ID, a), b && 0 !== b.buttons ? u.move(c) : u.down(c)
        }
      },
      mousemove: function (a) {
        if (!this.isEventSimulatedFromTouch(a)) {
          var b = this.prepareEvent(a);
          K || this.prepareButtonsForMove(b, a), b.button = -1, H.set(this.POINTER_ID, a), u.move(b)
        }
      },
      mouseup: function (a) {
        if (!this.isEventSimulatedFromTouch(a)) {
          var b = H.get(this.POINTER_ID),
            c = this.prepareEvent(a);
          if (!K) {
            var d = J[c.button];
            c.buttons = b ? b.buttons & ~d : 0, a.buttons = c.buttons
          }
          H.set(this.POINTER_ID, a),
            c.buttons &= ~J[c.button], 0 === c.buttons ? u.up(c) : u.move(c)
        }
      },
      mouseover: function (a) {
        if (!this.isEventSimulatedFromTouch(a)) {
          var b = this.prepareEvent(a);
          K || this.prepareButtonsForMove(b, a), b.button = -1, H.set(this.POINTER_ID, a), u.enterOver(b)
        }
      },
      mouseout: function (a) {
        if (!this.isEventSimulatedFromTouch(a)) {
          var b = this.prepareEvent(a);
          K || this.prepareButtonsForMove(b, a), b.button = -1, u.leaveOut(b)
        }
      },
      cancel: function (a) {
        var b = this.prepareEvent(a);
        u.cancel(b), this.deactivateMouse()
      },
      deactivateMouse: function () {
        H["delete"](this.POINTER_ID)
      }
    },
    O = u.captureInfo,
    P = v.findTarget.bind(v),
    Q = v.allShadows.bind(v),
    R = u.pointermap,
    S = 2500,
    T = 200,
    U = "touch-action",
    V = {
      events: ["touchstart", "touchmove", "touchend", "touchcancel"],
      register: function (a) {
        M.enableOnSubtree(a)
      },
      unregister: function () {},
      elementAdded: function (a) {
        var b = a.getAttribute(U),
          c = this.touchActionToScrollType(b);
        c && (a._scrollType = c, u.listen(a, this.events),
          Q(a).forEach(function (a) {
            a._scrollType = c, u.listen(a, this.events)
          }, this))
      },
      elementRemoved: function (a) {
        a._scrollType = void 0, u.unlisten(a, this.events),
          Q(a).forEach(function (a) {
            a._scrollType = void 0, u.unlisten(a, this.events)
          }, this)
      },
      elementChanged: function (a, b) {
        var c = a.getAttribute(U),
          d = this.touchActionToScrollType(c),
          e = this.touchActionToScrollType(b);
        d && e ? (a._scrollType = d, Q(a).forEach(function (a) {
          a._scrollType = d
        }, this)) : e ? this.elementRemoved(a) : d && this.elementAdded(a)
      },
      scrollTypes: {
        EMITTER: "none",
        XSCROLLER: "pan-x",
        YSCROLLER: "pan-y",
        SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/
      },
      touchActionToScrollType: function (a) {
        var b = a,
          c = this.scrollTypes;
        return "none" === b ? "none" : b === c.XSCROLLER ? "X" : b === c.YSCROLLER ? "Y" : c.SCROLLER.exec(b) ? "XY" : void 0
      },
      POINTER_TYPE: "touch",
      firstTouch: null,
      isPrimaryTouch: function (a) {
        return this.firstTouch === a.identifier
      },
      setPrimaryTouch: function (a) {
        (0 === R.size || 1 === R.size && R.has(1)) && (this.firstTouch = a.identifier, this.firstXY = {
          X: a.clientX,
          Y: a.clientY
        }, this.scrolling = !1, this.cancelResetClickCount())
      },
      removePrimaryPointer: function (a) {
        a.isPrimary && (this.firstTouch = null, this.firstXY = null, this.resetClickCount())
      },
      clickCount: 0,
      resetId: null,
      resetClickCount: function () {
        var a = function () {
          this.clickCount = 0, this.resetId = null
        }.bind(this);
        this.resetId = setTimeout(a, T)
      },
      cancelResetClickCount: function () {
        this.resetId && clearTimeout(this.resetId)
      },
      typeToButtons: function (a) {
        var b = 0;
        return "touchstart" !== a && "touchmove" !== a || (b = 1), b
      },
      touchToPointer: function (a) {
        var b = this.currentTouchEvent,
          c = u.cloneEvent(a),
          d = c.pointerId = a.identifier + 2;
        c.target = O[d] || P(c), c.bubbles = !0, c.cancelable = !0, c.detail = this.clickCount, c.button = 0, c.buttons = this.typeToButtons(b.type), c.width = 2 * (a.radiusX || a.webkitRadiusX || 0), c.height = 2 * (a.radiusY || a.webkitRadiusY || 0), c.pressure = a.force || a.webkitForce || .5, c.isPrimary = this.isPrimaryTouch(a), c.pointerType = this.POINTER_TYPE,
          c.altKey = b.altKey, c.ctrlKey = b.ctrlKey, c.metaKey = b.metaKey, c.shiftKey = b.shiftKey;
        var e = this;
        return c.preventDefault = function () {
          e.scrolling = !1, e.firstXY = null, b.preventDefault()
        }, c
      },
      processTouches: function (a, b) {
        var c = a.changedTouches;
        this.currentTouchEvent = a;
        for (var d, e = 0; e < c.length; e++) d = c[e], b.call(this, this.touchToPointer(d))
      },
      shouldScroll: function (a) {
        if (this.firstXY) {
          var b, c = a.currentTarget._scrollType;
          if ("none" === c)
            b = !1;
          else if ("XY" === c)
            b = !0;
          else {
            var d = a.changedTouches[0],
              e = c,
              f = "Y" === c ? "X" : "Y",
              g = Math.abs(d["client" + e] - this.firstXY[e]),
              h = Math.abs(d["client" + f] - this.firstXY[f]);
            b = g >= h
          }
          return this.firstXY = null, b
        }
      },
      findTouch: function (a, b) {
        for (var c, d = 0, e = a.length; d < e && (c = a[d]); d++)
          if (c.identifier === b) return !0
      },
      vacuumTouches: function (a) {
        var b = a.touches;
        if (R.size >= b.length) {
          var c = [];
          R.forEach(function (a, d) {
            if (1 !== d && !this.findTouch(b, d - 2)) {
              var e = a.out;
              c.push(e)
            }
          }, this), c.forEach(this.cancelOut, this)
        }
      },
      touchstart: function (a) {
        this.vacuumTouches(a), this.setPrimaryTouch(a.changedTouches[0]), this.dedupSynthMouse(a), this.scrolling || (this.clickCount++, this.processTouches(a, this.overDown))
      },
      overDown: function (a) {
        R.set(a.pointerId, {
          target: a.target,
          out: a,
          outTarget: a.target
        }), u.enterOver(a), u.down(a)
      },
      touchmove: function (a) {
        this.scrolling || (this.shouldScroll(a) ? (this.scrolling = !0, this.touchcancel(a)) : (a.preventDefault(), this.processTouches(a, this.moveOverOut)))
      },
      moveOverOut: function (a) {
        var b = a,
          c = R.get(b.pointerId);
        if (c) {
          var d = c.out,
            e = c.outTarget;
          u.move(b), d && e !== b.target && (d.relatedTarget = b.target, b.relatedTarget = e,
            d.target = e, b.target ? (u.leaveOut(d), u.enterOver(b)) : (
              b.target = e, b.relatedTarget = null, this.cancelOut(b))), c.out = b, c.outTarget = b.target
        }
      },
      touchend: function (a) {
        this.dedupSynthMouse(a), this.processTouches(a, this.upOut)
      },
      upOut: function (a) {
        this.scrolling || (u.up(a), u.leaveOut(a)), this.cleanUpPointer(a)
      },
      touchcancel: function (a) {
        this.processTouches(a, this.cancelOut)
      },
      cancelOut: function (a) {
        u.cancel(a), u.leaveOut(a), this.cleanUpPointer(a)
      },
      cleanUpPointer: function (a) {
        R["delete"](a.pointerId), this.removePrimaryPointer(a)
      },
      dedupSynthMouse: function (a) {
        var b = N.lastTouches,
          c = a.changedTouches[0];
        if (this.isPrimaryTouch(c)) {
          var d = {
            x: c.clientX,
            y: c.clientY
          };
          b.push(d);
          var e = function (a, b) {
            var c = a.indexOf(b);
            c > -1 && a.splice(c, 1)
          }.bind(null, b, d);
          setTimeout(e, S)
        }
      }
    };
  M = new c(V.elementAdded, V.elementRemoved, V.elementChanged, V);
  var W, X, Y, Z = u.pointermap,
    $ = window.MSPointerEvent && "number" == typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,
    _ = {
      events: ["MSPointerDown", "MSPointerMove", "MSPointerUp", "MSPointerOut", "MSPointerOver", "MSPointerCancel", "MSGotPointerCapture", "MSLostPointerCapture"],
      register: function (a) {
        u.listen(a, this.events)
      },
      unregister: function (a) {
        u.unlisten(a, this.events)
      },
      POINTER_TYPES: ["", "unavailable", "touch", "pen", "mouse"],
      prepareEvent: function (a) {
        var b = a;
        return $ && (b = u.cloneEvent(a), b.pointerType = this.POINTER_TYPES[a.pointerType]), b
      },
      cleanup: function (a) {
        Z["delete"](a)
      },
      MSPointerDown: function (a) {
        Z.set(a.pointerId, a);
        var b = this.prepareEvent(a);
        u.down(b)
      },
      MSPointerMove: function (a) {
        var b = this.prepareEvent(a);
        u.move(b)
      },
      MSPointerUp: function (a) {
        var b = this.prepareEvent(a);
        u.up(b), this.cleanup(a.pointerId)
      },
      MSPointerOut: function (a) {
        var b = this.prepareEvent(a);
        u.leaveOut(b)
      },
      MSPointerOver: function (a) {
        var b = this.prepareEvent(a);
        u.enterOver(b)
      },
      MSPointerCancel: function (a) {
        var b = this.prepareEvent(a);
        u.cancel(b), this.cleanup(a.pointerId)
      },
      MSLostPointerCapture: function (a) {
        var b = u.makeEvent("lostpointercapture", a);
        u.dispatchEvent(b)
      },
      MSGotPointerCapture: function (a) {
        var b = u.makeEvent("gotpointercapture", a);
        u.dispatchEvent(b)
      }
    },
    aa = window.navigator;
  aa.msPointerEnabled ? (W = function (a) {
    i(a), j(this), k(a) && (u.setCapture(a, this, !0), this.msSetPointerCapture(a))
  }, X = function (a) {
    i(a), u.releaseCapture(a, !0), this.msReleasePointerCapture(a)
  }) : (W = function (a) {
    i(a), j(this), k(a) && u.setCapture(a, this)
  }, X = function (a) {
    i(a), u.releaseCapture(a)
  }), Y = function (a) {
    return !!u.captureInfo[a]
  }, g(), h(), l();
  var ba = {
    dispatcher: u,
    Installer: c,
    PointerEvent: a,
    PointerMap: p,
    targetFinding: v
  };
  return ba
});
///////////////////////////////////////////////

///////////////////////////////////////////////
var config = {"show_fabrication":false,"redraw_on_drag":true,"highlight_pin1":false,"extra_fields":["BOM_Manufacturer","BOM_Manufacturer Part","BOM_Supplier","BOM_Supplier Part"],"dark_mode":false,"bom_view":"left-right","board_rotation":0,"checkboxes":"Sourced,Placed","show_silkscreen":true,"show_pads":true,"layer_view":"FB"};
///////////////////////////////////////////////

///////////////////////////////////////////////
var pcbdata = {"ibom_version":"v2.3-50-g53ae\n","edges_bbox":{"minx":3877.6,"miny":3273.8,"maxx":4161.1,"maxy":3371.8},"edges":[{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3899.8115,3333.9015 3889.969,3333.9015"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4139.9685,3307.9173 4149.811,3307.9173 4149.811,3285.4764 3889.969,3285.4764 3889.969,3307.9173 3899.8115,3307.9173"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3889.969,3333.9015 3889.969,3356.3424 4149.811,3356.3424 4149.811,3333.9015 4139.9685,3333.9015"},{"type":"arc","width":1,"svgpath":"M 4139.9685 3307.9173 A 12.9921 12.9921 0 1 0 4139.9685 3333.9015","net":""},{"type":"arc","width":1,"svgpath":"M 3899.8115 3333.9015 A 12.9921 12.9921 0 1 0 3899.8115 3307.9173","net":""},{"type":"circle","start":[4138,3296.5],"radius":4.7244,"width":0.5},{"type":"circle","start":[3901.78,3296.5],"radius":4.7244,"width":0.5},{"type":"circle","start":[3901.78,3345.319],"radius":4.7244,"width":0.5},{"type":"circle","start":[4138,3345.319],"radius":4.7244,"width":0.5}],"drawings":{"silkscreen":{"F":[{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4042.9527,3314.5967 4042.9527,3327.4169"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4055.118,3313.3962 4055.118,3309.1886 4050.9054,3309.1886"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4055.118,3317.3332 4055.118,3316.791"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4055.118,3321.2702 4055.118,3320.728"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4055.118,3325.2072 4055.118,3324.665"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4055.118,3328.2437 4055.118,3332.4956 4050.9054,3332.4956"},{"type":"circle","_svgpath":"M 4057.205, 3329.78 m -0.5, 0 a 0.5,0.5 0 1,0 1,0 a 0.5,0.5 0 1,0 -1,0","start":[4057.205,3329.78],"radius":0.5,"width":"1","net":""},{"type":"text","svgpath":"M 4067.7641 3362.2248 L 4067.5541 3361.8148 L 4066.9441 3361.2048 L 4071.2341 3361.2048 M 4070.2141 3359.6448 L 4070.4241 3359.8548 L 4070.6241 3359.6448 L 4070.4241 3359.4448 L 4070.2141 3359.6448 M 4066.9441 3356.8648 L 4067.1441 3357.4748 L 4067.7641 3357.8848 L 4068.7841 3358.0948 L 4069.3941 3358.0948 L 4070.4241 3357.8848 L 4071.0341 3357.4748 L 4071.2341 3356.8648 L 4071.2341 3356.4548 L 4071.0341 3355.8448 L 4070.4241 3355.4348 L 4069.3941 3355.2248 L 4068.7841 3355.2248 L 4067.7641 3355.4348 L 4067.1441 3355.8448 L 4066.9441 3356.4548 L 4066.9441 3356.8648 M 4066.9441 3352.4448 L 4071.2341 3352.4448 M 4066.9441 3353.8748 L 4066.9441 3351.0148 M 4069.3941 3349.6648 L 4069.3941 3345.9848 M 4066.9441 3342.5848 L 4069.8041 3344.6348 L 4069.8041 3341.5648 M 4066.9441 3342.5848 L 4071.2341 3342.5848 M 4066.9441 3340.2148 L 4071.2341 3340.2148 M 4066.9441 3340.2148 L 4066.9441 3338.3748 L 4067.1441 3337.7648 L 4067.3541 3337.5548 L 4067.7641 3337.3548 L 4068.3741 3337.3548 L 4068.7841 3337.5548 L 4068.9841 3337.7648 L 4069.1941 3338.3748 L 4069.1941 3340.2148 M 4066.9441 3336.0048 L 4071.2341 3336.0048 M 4071.2341 3336.0048 L 4071.2341 3333.5448 M 4066.9441 3330.7648 L 4071.2341 3330.7648 M 4066.9441 3332.1948 L 4066.9441 3329.3348 M 4066.9441 3327.9848 L 4071.2341 3327.9848 M 4066.9441 3327.9848 L 4066.9441 3326.1448 L 4067.1441 3325.5248 L 4067.3541 3325.3248 L 4067.7641 3325.1248 L 4068.3741 3325.1248 L 4068.7841 3325.3248 L 4068.9841 3325.5248 L 4069.1941 3326.1448 L 4069.1941 3327.9848 M 4066.9441 3320.9048 L 4071.2341 3323.7748 M 4066.9441 3323.7748 L 4066.9441 3320.9048 M 4071.2341 3323.7748 L 4071.2341 3320.9048","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"text","svgpath":"M 4035.9324 3327.644 L 4036.1324 3328.054 L 4036.5424 3328.464 L 4036.9524 3328.674 L 4037.5724 3328.874 L 4038.5924 3328.874 L 4039.2024 3328.674 L 4039.6124 3328.464 L 4040.0224 3328.054 L 4040.2224 3327.644 L 4040.2224 3326.824 L 4040.0224 3326.424 L 4039.6124 3326.014 L 4039.2024 3325.804 L 4038.5924 3325.604 L 4037.5724 3325.604 L 4036.9524 3325.804 L 4036.5424 3326.014 L 4036.1324 3326.424 L 4035.9324 3326.824 L 4035.9324 3327.644 M 4039.4124 3327.034 L 4040.6324 3325.804 M 4035.9324 3324.254 L 4040.2224 3323.224 M 4035.9324 3322.204 L 4040.2224 3323.224 M 4035.9324 3322.204 L 4040.2224 3321.184 M 4035.9324 3320.164 L 4040.2224 3321.184 M 4035.9324 3318.814 L 4040.2224 3318.814 M 4035.9324 3317.464 L 4040.2224 3317.464 M 4036.9524 3313.044 L 4036.5424 3313.244 L 4036.1324 3313.654 L 4035.9324 3314.064 L 4035.9324 3314.884 L 4036.1324 3315.294 L 4036.5424 3315.704 L 4036.9524 3315.904 L 4037.5724 3316.114 L 4038.5924 3316.114 L 4039.2024 3315.904 L 4039.6124 3315.704 L 4040.0224 3315.294 L 4040.2224 3314.884 L 4040.2224 3314.064 L 4040.0224 3313.654 L 4039.6124 3313.244 L 4039.2024 3313.044","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","ref":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4069.3737,3315.0001 4069.3737,3327.0001"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4081.8737,3310.5001 4075.3737,3310.5001"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4081.8737,3326.8313 4081.8737,3331.5001 4075.3737,3331.5001"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4081.8737,3322.8943 4081.8737,3323.0427"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4081.8737,3318.9573 4081.8737,3319.1057"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4081.8737,3310.5001 4081.8737,3315.1687"},{"type":"circle","_svgpath":"M 4084.374, 3313.5 m -0.5, 0 a 0.5,0.5 0 1,0 1,0 a 0.5,0.5 0 1,0 -1,0","start":[4084.374,3313.5],"radius":0.5,"width":"1","net":""},{"type":"text","svgpath":"M 4095.9228 3383.7629 L 4100.2128 3383.7629 M 4095.9228 3380.9029 L 4100.2128 3380.9029 M 4097.9628 3383.7629 L 4097.9628 3380.9029 M 4095.9228 3379.5529 L 4100.2128 3379.5529 M 4095.9228 3379.5529 L 4095.9228 3378.1129 L 4096.1228 3377.5029 L 4096.5328 3377.0929 L 4096.9428 3376.8929 L 4097.5628 3376.6829 L 4098.5828 3376.6829 L 4099.1928 3376.8929 L 4099.6028 3377.0929 L 4100.0128 3377.5029 L 4100.2128 3378.1129 L 4100.2128 3379.5529 M 4096.9428 3372.2629 L 4096.5328 3372.4729 L 4096.1228 3372.8829 L 4095.9228 3373.2929 L 4095.9228 3374.1129 L 4096.1228 3374.5129 L 4096.5328 3374.9229 L 4096.9428 3375.1329 L 4097.5628 3375.3329 L 4098.5828 3375.3329 L 4099.1928 3375.1329 L 4099.6028 3374.9229 L 4100.0128 3374.5129 L 4100.2128 3374.1129 L 4100.2128 3373.2929 L 4100.0128 3372.8829 L 4099.6028 3372.4729 L 4099.1928 3372.2629 L 4098.5828 3372.2629 M 4098.5828 3373.2929 L 4098.5828 3372.2629 M 4096.9428 3367.8529 L 4096.5328 3368.0529 L 4096.1228 3368.4629 L 4095.9228 3368.8729 L 4095.9228 3369.6929 L 4096.1228 3370.1029 L 4096.5328 3370.5129 L 4096.9428 3370.7129 L 4097.5628 3370.9129 L 4098.5828 3370.9129 L 4099.1928 3370.7129 L 4099.6028 3370.5129 L 4100.0128 3370.1029 L 4100.2128 3369.6929 L 4100.2128 3368.8729 L 4100.0128 3368.4629 L 4099.6028 3368.0529 L 4099.1928 3367.8529 M 4096.7428 3366.5029 L 4096.5328 3366.0929 L 4095.9228 3365.4729 L 4100.2128 3365.4729 M 4095.9228 3362.9029 L 4096.1228 3363.5129 L 4096.7428 3363.9229 L 4097.7628 3364.1229 L 4098.3728 3364.1229 L 4099.4028 3363.9229 L 4100.0128 3363.5129 L 4100.2128 3362.9029 L 4100.2128 3362.4929 L 4100.0128 3361.8729 L 4099.4028 3361.4629 L 4098.3728 3361.2629 L 4097.7628 3361.2629 L 4096.7428 3361.4629 L 4096.1228 3361.8729 L 4095.9228 3362.4929 L 4095.9228 3362.9029 M 4095.9228 3358.6829 L 4096.1228 3359.3029 L 4096.7428 3359.7129 L 4097.7628 3359.9129 L 4098.3728 3359.9129 L 4099.4028 3359.7129 L 4100.0128 3359.3029 L 4100.2128 3358.6829 L 4100.2128 3358.2729 L 4100.0128 3357.6629 L 4099.4028 3357.2529 L 4098.3728 3357.0529 L 4097.7628 3357.0529 L 4096.7428 3357.2529 L 4096.1228 3357.6629 L 4095.9228 3358.2729 L 4095.9228 3358.6829 M 4096.9428 3355.4929 L 4096.7428 3355.4929 L 4096.3328 3355.2929 L 4096.1228 3355.0829 L 4095.9228 3354.6729 L 4095.9228 3353.8629 L 4096.1228 3353.4529 L 4096.3328 3353.2429 L 4096.7428 3353.0429 L 4097.1528 3353.0429 L 4097.5628 3353.2429 L 4098.1728 3353.6529 L 4100.2128 3355.7029 L 4100.2128 3352.8329 M 4095.9228 3351.4829 L 4100.2128 3350.4629 M 4095.9228 3349.4429 L 4100.2128 3350.4629 M 4095.9228 3349.4429 L 4100.2128 3348.4129 M 4095.9228 3347.3929 L 4100.2128 3348.4129 M 4095.9228 3346.0429 L 4100.2128 3344.4129 M 4095.9228 3342.7729 L 4100.2128 3344.4129 M 4098.3728 3341.4229 L 4098.3728 3337.7429 M 4096.5328 3333.5229 L 4096.1228 3333.9329 L 4095.9228 3334.5529 L 4095.9228 3335.3629 L 4096.1228 3335.9829 L 4096.5328 3336.3929 L 4096.9428 3336.3929 L 4097.3528 3336.1829 L 4097.5628 3335.9829 L 4097.7628 3335.5729 L 4098.1728 3334.3429 L 4098.3728 3333.9329 L 4098.5828 3333.7329 L 4098.9928 3333.5229 L 4099.6028 3333.5229 L 4100.0128 3333.9329 L 4100.2128 3334.5529 L 4100.2128 3335.3629 L 4100.0128 3335.9829 L 4099.6028 3336.3929 M 4098.3728 3332.1729 L 4098.3728 3328.4929 M 4095.9228 3326.7329 L 4095.9228 3324.4829 L 4097.5628 3325.7129 L 4097.5628 3325.1029 L 4097.7628 3324.6929 L 4097.9628 3324.4829 L 4098.5828 3324.2829 L 4098.9928 3324.2829 L 4099.6028 3324.4829 L 4100.0128 3324.8929 L 4100.2128 3325.5129 L 4100.2128 3326.1229 L 4100.0128 3326.7329 L 4099.8128 3326.9429 L 4099.4028 3327.1429 M 4095.9228 3322.9329 L 4100.2128 3322.9329 M 4095.9228 3322.9329 L 4095.9228 3321.0929 L 4096.1228 3320.4729 L 4096.3328 3320.2729 L 4096.7428 3320.0629 L 4097.3528 3320.0629 L 4097.7628 3320.2729 L 4097.9628 3320.4729 L 4098.1728 3321.0929 L 4098.1728 3322.9329","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"text","svgpath":"M 4062.704 3328.0866 L 4065.774 3328.0866 L 4066.384 3327.8866 L 4066.794 3327.4766 L 4066.994 3326.8566 L 4066.994 3326.4466 L 4066.794 3325.8366 L 4066.384 3325.4266 L 4065.774 3325.2266 L 4062.704 3325.2266 M 4062.704 3322.2366 L 4066.994 3323.8766 M 4062.704 3322.2366 L 4066.994 3320.5966 M 4065.564 3323.2566 L 4065.564 3321.2166 M 4062.704 3319.2466 L 4066.994 3319.2466 M 4062.704 3319.2466 L 4062.704 3317.4066 L 4062.904 3316.7966 L 4063.114 3316.5866 L 4063.524 3316.3866 L 4063.934 3316.3866 L 4064.344 3316.5866 L 4064.544 3316.7966 L 4064.744 3317.4066 L 4064.744 3319.2466 M 4064.744 3317.8166 L 4066.994 3316.3866 M 4062.704 3313.6066 L 4066.994 3313.6066 M 4062.704 3315.0366 L 4062.704 3312.1766","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","ref":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3985.945,3311 3985.945,3331"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3924.134,3311 3985.945,3311"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3924.134,3331 3985.945,3331"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3924.134,3320.9722 3935.0395,3320.9722 3935.0395,3331"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3924.134,3311 3924.134,3331"},{"type":"text","svgpath":"M 3955.2395 3299.48 L 3955.2395 3299.28 L 3955.4495 3298.87 L 3955.6495 3298.66 L 3956.0595 3298.46 L 3956.8795 3298.46 L 3957.2895 3298.66 L 3957.4895 3298.87 L 3957.6995 3299.28 L 3957.6995 3299.69 L 3957.4895 3300.1 L 3957.0895 3300.71 L 3955.0395 3302.75 L 3957.8995 3302.75 M 3959.2495 3299.28 L 3959.6595 3299.07 L 3960.2795 3298.46 L 3960.2795 3302.75 M 3962.8495 3298.46 L 3962.2395 3298.66 L 3961.8295 3299.28 L 3961.6295 3300.3 L 3961.6295 3300.91 L 3961.8295 3301.94 L 3962.2395 3302.55 L 3962.8495 3302.75 L 3963.2595 3302.75 L 3963.8795 3302.55 L 3964.2895 3301.94 L 3964.4895 3300.91 L 3964.4895 3300.3 L 3964.2895 3299.28 L 3963.8795 3298.66 L 3963.2595 3298.46 L 3962.8495 3298.46 M 3968.6995 3299.07 L 3968.2895 3298.66 L 3967.6795 3298.46 L 3966.8595 3298.46 L 3966.2495 3298.66 L 3965.8395 3299.07 L 3965.8395 3299.48 L 3966.0395 3299.89 L 3966.2495 3300.1 L 3966.6595 3300.3 L 3967.8895 3300.71 L 3968.2895 3300.91 L 3968.4995 3301.12 L 3968.6995 3301.53 L 3968.6995 3302.14 L 3968.2895 3302.55 L 3967.6795 3302.75 L 3966.8595 3302.75 L 3966.2495 3302.55 L 3965.8395 3302.14 M 3970.0495 3300.91 L 3973.7395 3300.91 M 3975.2895 3299.48 L 3975.2895 3299.28 L 3975.4895 3298.87 L 3975.6995 3298.66 L 3976.1095 3298.46 L 3976.9295 3298.46 L 3977.3395 3298.66 L 3977.5395 3298.87 L 3977.7395 3299.28 L 3977.7395 3299.69 L 3977.5395 3300.1 L 3977.1295 3300.71 L 3975.0895 3302.75 L 3977.9495 3302.75 M 3980.3195 3299.69 L 3980.3195 3302.14 M 3979.2995 3300.3 L 3981.3395 3301.53 M 3981.3395 3300.3 L 3979.2995 3301.53 M 3985.1495 3299.07 L 3984.9395 3298.66 L 3984.3295 3298.46 L 3983.9195 3298.46 L 3983.3095 3298.66 L 3982.8995 3299.28 L 3982.6895 3300.3 L 3982.6895 3301.32 L 3982.8995 3302.14 L 3983.3095 3302.55 L 3983.9195 3302.75 L 3984.1295 3302.75 L 3984.7395 3302.55 L 3985.1495 3302.14 L 3985.3495 3301.53 L 3985.3495 3301.32 L 3985.1495 3300.71 L 3984.7395 3300.3 L 3984.1295 3300.1 L 3983.9195 3300.1 L 3983.3095 3300.3 L 3982.8995 3300.71 L 3982.6895 3301.32 M 3986.6995 3298.46 L 3986.6995 3302.75 M 3986.6995 3298.46 L 3988.5395 3298.46 L 3989.1595 3298.66 L 3989.3595 3298.87 L 3989.5695 3299.28 L 3989.5695 3299.89 L 3989.3595 3300.3 L 3989.1595 3300.5 L 3988.5395 3300.71 L 3986.6995 3300.71 M 3994.0695 3298.46 L 3994.0695 3302.75 M 3994.0695 3302.75 L 3996.5195 3302.75 M 3997.8695 3300.3 L 4001.5495 3300.3 M 3997.8695 3301.53 L 4001.5495 3301.53 M 4002.8995 3299.28 L 4003.3095 3299.07 L 4003.9295 3298.46 L 4003.9295 3302.75 M 4005.2795 3299.28 L 4005.6895 3299.07 L 4006.2995 3298.46 L 4006.2995 3302.75 M 4007.8495 3301.73 L 4007.6495 3301.94 L 4007.8495 3302.14 L 4008.0595 3301.94 L 4007.8495 3301.73 M 4011.8595 3299.07 L 4011.6595 3298.66 L 4011.0395 3298.46 L 4010.6395 3298.46 L 4010.0195 3298.66 L 4009.6095 3299.28 L 4009.4095 3300.3 L 4009.4095 3301.32 L 4009.6095 3302.14 L 4010.0195 3302.55 L 4010.6395 3302.75 L 4010.8395 3302.75 L 4011.4495 3302.55 L 4011.8595 3302.14 L 4012.0695 3301.53 L 4012.0695 3301.32 L 4011.8595 3300.71 L 4011.4495 3300.3 L 4010.8395 3300.1 L 4010.6395 3300.1 L 4010.0195 3300.3 L 4009.6095 3300.71 L 4009.4095 3301.32 M 4013.4195 3298.46 L 4013.4195 3302.75 M 4013.4195 3298.46 L 4015.0495 3302.75 M 4016.6895 3298.46 L 4015.0495 3302.75 M 4016.6895 3298.46 L 4016.6895 3302.75 M 4018.0395 3298.46 L 4018.0395 3302.75 M 4018.0395 3298.46 L 4019.6795 3302.75 M 4021.3095 3298.46 L 4019.6795 3302.75 M 4021.3095 3298.46 L 4021.3095 3302.75 M 4025.7295 3299.48 L 4025.5295 3299.07 L 4025.1195 3298.66 L 4024.7095 3298.46 L 4023.8895 3298.46 L 4023.4795 3298.66 L 4023.0695 3299.07 L 4022.8695 3299.48 L 4022.6595 3300.1 L 4022.6595 3301.12 L 4022.8695 3301.73 L 4023.0695 3302.14 L 4023.4795 3302.55 L 4023.8895 3302.75 L 4024.7095 3302.75 L 4025.1195 3302.55 L 4025.5295 3302.14 L 4025.7295 3301.73 L 4025.7295 3301.12 M 4024.7095 3301.12 L 4025.7295 3301.12 M 4028.0995 3299.89 L 4027.6895 3300.1 L 4027.2895 3300.5 L 4027.0795 3301.12 L 4027.0795 3301.53 L 4027.2895 3302.14 L 4027.6895 3302.55 L 4028.0995 3302.75 L 4028.7195 3302.75 L 4029.1295 3302.55 L 4029.5395 3302.14 L 4029.7395 3301.53 L 4029.7395 3301.12 L 4029.5395 3300.5 L 4029.1295 3300.1 L 4028.7195 3299.89 L 4028.0995 3299.89 M 4031.0895 3298.46 L 4031.0895 3302.75 M 4034.8895 3298.46 L 4034.8895 3302.75 M 4034.8895 3300.5 L 4034.4895 3300.1 L 4034.0795 3299.89 L 4033.4595 3299.89 L 4033.0495 3300.1 L 4032.6395 3300.5 L 4032.4395 3301.12 L 4032.4395 3301.53 L 4032.6395 3302.14 L 4033.0495 3302.55 L 4033.4595 3302.75 L 4034.0795 3302.75 L 4034.4895 3302.55 L 4034.8895 3302.14 M 4036.2395 3300.91 L 4039.9295 3300.91 M 4041.2795 3299.89 L 4041.2795 3304.19 M 4041.2795 3300.5 L 4041.6895 3300.1 L 4042.0895 3299.89 L 4042.7095 3299.89 L 4043.1195 3300.1 L 4043.5295 3300.5 L 4043.7295 3301.12 L 4043.7295 3301.53 L 4043.5295 3302.14 L 4043.1195 3302.55 L 4042.7095 3302.75 L 4042.0895 3302.75 L 4041.6895 3302.55 L 4041.2795 3302.14 M 4045.0795 3298.46 L 4045.0795 3302.75 M 4048.8895 3299.89 L 4048.8895 3302.75 M 4048.8895 3300.5 L 4048.4795 3300.1 L 4048.0695 3299.89 L 4047.4495 3299.89 L 4047.0395 3300.1 L 4046.6395 3300.5 L 4046.4295 3301.12 L 4046.4295 3301.53 L 4046.6395 3302.14 L 4047.0395 3302.55 L 4047.4495 3302.75 L 4048.0695 3302.75 L 4048.4795 3302.55 L 4048.8895 3302.14 M 4050.8495 3298.46 L 4050.8495 3301.94 L 4051.0495 3302.55 L 4051.4595 3302.75 L 4051.8695 3302.75 M 4050.2395 3299.89 L 4051.6695 3299.89 M 4053.2195 3301.12 L 4055.6795 3301.12 L 4055.6795 3300.71 L 4055.4695 3300.3 L 4055.2695 3300.1 L 4054.8595 3299.89 L 4054.2395 3299.89 L 4053.8395 3300.1 L 4053.4295 3300.5 L 4053.2195 3301.12 L 4053.2195 3301.53 L 4053.4295 3302.14 L 4053.8395 3302.55 L 4054.2395 3302.75 L 4054.8595 3302.75 L 4055.2695 3302.55 L 4055.6795 3302.14 M 4059.4795 3298.46 L 4059.4795 3302.75 M 4059.4795 3300.5 L 4059.0695 3300.1 L 4058.6595 3299.89 L 4058.0495 3299.89 L 4057.6395 3300.1 L 4057.2295 3300.5 L 4057.0295 3301.12 L 4057.0295 3301.53 L 4057.2295 3302.14 L 4057.6395 3302.55 L 4058.0495 3302.75 L 4058.6595 3302.75 L 4059.0695 3302.55 L 4059.4795 3302.14 M 4063.9795 3298.46 L 4063.9795 3302.75 M 4063.9795 3300.5 L 4064.3895 3300.1 L 4064.7995 3299.89 L 4065.4095 3299.89 L 4065.8195 3300.1 L 4066.2295 3300.5 L 4066.4395 3301.12 L 4066.4395 3301.53 L 4066.2295 3302.14 L 4065.8195 3302.55 L 4065.4095 3302.75 L 4064.7995 3302.75 L 4064.3895 3302.55 L 4063.9795 3302.14 M 4067.7895 3298.46 L 4067.7895 3302.75 M 4071.5895 3299.89 L 4071.5895 3302.75 M 4071.5895 3300.5 L 4071.1795 3300.1 L 4070.7695 3299.89 L 4070.1595 3299.89 L 4069.7495 3300.1 L 4069.3395 3300.5 L 4069.1395 3301.12 L 4069.1395 3301.53 L 4069.3395 3302.14 L 4069.7495 3302.55 L 4070.1595 3302.75 L 4070.7695 3302.75 L 4071.1795 3302.55 L 4071.5895 3302.14 M 4075.3895 3300.5 L 4074.9895 3300.1 L 4074.5795 3299.89 L 4073.9595 3299.89 L 4073.5495 3300.1 L 4073.1395 3300.5 L 4072.9395 3301.12 L 4072.9395 3301.53 L 4073.1395 3302.14 L 4073.5495 3302.55 L 4073.9595 3302.75 L 4074.5795 3302.75 L 4074.9895 3302.55 L 4075.3895 3302.14 M 4076.7395 3298.46 L 4076.7395 3302.75 M 4078.7895 3299.89 L 4076.7395 3301.94 M 4077.5595 3301.12 L 4078.9895 3302.75","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"text","svgpath":"M 3918.4487 3324.6229 L 3918.0387 3324.8329 L 3917.6287 3325.2429 L 3917.4287 3325.6429 L 3917.4287 3326.4629 L 3917.6287 3326.8729 L 3918.0387 3327.2829 L 3918.4487 3327.4929 L 3919.0687 3327.6929 L 3920.0887 3327.6929 L 3920.6987 3327.4929 L 3921.1087 3327.2829 L 3921.5187 3326.8729 L 3921.7187 3326.4629 L 3921.7187 3325.6429 L 3921.5187 3325.2429 L 3921.1087 3324.8329 L 3920.6987 3324.6229 L 3920.0887 3324.6229 M 3920.0887 3325.6429 L 3920.0887 3324.6229 M 3917.4287 3323.2729 L 3921.7187 3323.2729 M 3917.4287 3323.2729 L 3917.4287 3321.4329 L 3917.6287 3320.8229 L 3917.8387 3320.6129 L 3918.2487 3320.4129 L 3918.8587 3320.4129 L 3919.2687 3320.6129 L 3919.4687 3320.8229 L 3919.6787 3321.4329 L 3919.6787 3323.2729 M 3917.4287 3319.0629 L 3921.7187 3319.0629 M 3917.4287 3316.4829 L 3917.6287 3316.8929 L 3918.0387 3317.3029 L 3918.4487 3317.5029 L 3919.0687 3317.7129 L 3920.0887 3317.7129 L 3920.6987 3317.5029 L 3921.1087 3317.3029 L 3921.5187 3316.8929 L 3921.7187 3316.4829 L 3921.7187 3315.6629 L 3921.5187 3315.2529 L 3921.1087 3314.8429 L 3920.6987 3314.6429 L 3920.0887 3314.4429 L 3919.0687 3314.4429 L 3918.4487 3314.6429 L 3918.0387 3314.8429 L 3917.6287 3315.2529 L 3917.4287 3315.6629 L 3917.4287 3316.4829","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","ref":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4097.4777,3295 4095.2125,3295 4095.2125,3346.5 4097.4902,3346.5"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4123.7125,3326.375 4123.7125,3346.5 4110.7125,3346.5 4110.6974,3346.5151"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4110.7111,3295 4123.7125,3295 4123.7125,3315.625"},{"type":"circle","_svgpath":"M 4099.712, 3303.001 m -0.787, 0 a 0.787,0.787 0 1,0 1.574,0 a 0.787,0.787 0 1,0 -1.574,0","start":[4099.712,3303.001],"radius":0.787,"width":"1.5748","net":""},{"type":"text","svgpath":"M 4133.6723 3399.9904 L 4136.7423 3399.9904 L 4137.3523 3399.7904 L 4137.7623 3399.3804 L 4137.9623 3398.7604 L 4137.9623 3398.3504 L 4137.7623 3397.7404 L 4137.3523 3397.3304 L 4136.7423 3397.1304 L 4133.6723 3397.1304 M 4134.2823 3392.9104 L 4133.8723 3393.3204 L 4133.6723 3393.9404 L 4133.6723 3394.7504 L 4133.8723 3395.3704 L 4134.2823 3395.7804 L 4134.6923 3395.7804 L 4135.1023 3395.5704 L 4135.3123 3395.3704 L 4135.5123 3394.9604 L 4135.9223 3393.7304 L 4136.1223 3393.3204 L 4136.3323 3393.1204 L 4136.7423 3392.9104 L 4137.3523 3392.9104 L 4137.7623 3393.3204 L 4137.9623 3393.9404 L 4137.9623 3394.7504 L 4137.7623 3395.3704 L 4137.3523 3395.7804 M 4133.6723 3391.5604 L 4137.9623 3391.5604 M 4133.6723 3391.5604 L 4133.6723 3389.7204 L 4133.8723 3389.1104 L 4134.0823 3388.9004 L 4134.4923 3388.7004 L 4134.9023 3388.7004 L 4135.3123 3388.9004 L 4135.5123 3389.1104 L 4135.7123 3389.7204 M 4135.7123 3391.5604 L 4135.7123 3389.7204 L 4135.9223 3389.1104 L 4136.1223 3388.9004 L 4136.5323 3388.7004 L 4137.1523 3388.7004 L 4137.5623 3388.9004 L 4137.7623 3389.1104 L 4137.9623 3389.7204 L 4137.9623 3391.5604 M 4136.1223 3387.3504 L 4136.1223 3383.6704 M 4133.6723 3380.6804 L 4137.9623 3382.3204 M 4133.6723 3380.6804 L 4137.9623 3379.0404 M 4136.5323 3381.7004 L 4136.5323 3379.6604 M 4133.6723 3371.3904 L 4137.9623 3369.7604 M 4133.6723 3368.1204 L 4137.9623 3369.7604 M 4136.3323 3366.7704 L 4136.3323 3364.3204 L 4135.9223 3364.3204 L 4135.5123 3364.5204 L 4135.3123 3364.7304 L 4135.1023 3365.1404 L 4135.1023 3365.7504 L 4135.3123 3366.1604 L 4135.7123 3366.5704 L 4136.3323 3366.7704 L 4136.7423 3366.7704 L 4137.3523 3366.5704 L 4137.7623 3366.1604 L 4137.9623 3365.7504 L 4137.9623 3365.1404 L 4137.7623 3364.7304 L 4137.3523 3364.3204 M 4135.1023 3362.9704 L 4137.9623 3362.9704 M 4136.3323 3362.9704 L 4135.7123 3362.7604 L 4135.3123 3362.3504 L 4135.1023 3361.9404 L 4135.1023 3361.3304 M 4133.6723 3359.3704 L 4137.1523 3359.3704 L 4137.7623 3359.1604 L 4137.9623 3358.7504 L 4137.9623 3358.3404 M 4135.1023 3359.9804 L 4135.1023 3358.5504 M 4133.6723 3356.9904 L 4133.8723 3356.7904 L 4133.6723 3356.5904 L 4133.4623 3356.7904 L 4133.6723 3356.9904 M 4135.1023 3356.7904 L 4137.9623 3356.7904 M 4135.7123 3352.7804 L 4135.3123 3353.1904 L 4135.1023 3353.6004 L 4135.1023 3354.2104 L 4135.3123 3354.6204 L 4135.7123 3355.0304 L 4136.3323 3355.2404 L 4136.7423 3355.2404 L 4137.3523 3355.0304 L 4137.7623 3354.6204 L 4137.9623 3354.2104 L 4137.9623 3353.6004 L 4137.7623 3353.1904 L 4137.3523 3352.7804 M 4135.1023 3348.9804 L 4137.9623 3348.9804 M 4135.7123 3348.9804 L 4135.3123 3349.3904 L 4135.1023 3349.7904 L 4135.1023 3350.4104 L 4135.3123 3350.8204 L 4135.7123 3351.2304 L 4136.3323 3351.4304 L 4136.7423 3351.4304 L 4137.3523 3351.2304 L 4137.7623 3350.8204 L 4137.9623 3350.4104 L 4137.9623 3349.7904 L 4137.7623 3349.3904 L 4137.3523 3348.9804 M 4133.6723 3347.6304 L 4137.9623 3347.6304 M 4134.4923 3343.1304 L 4134.2823 3342.7204 L 4133.6723 3342.1004 L 4137.9623 3342.1004 M 4133.6723 3339.5304 L 4133.8723 3340.1404 L 4134.4923 3340.5504 L 4135.5123 3340.7504 L 4136.1223 3340.7504 L 4137.1523 3340.5504 L 4137.7623 3340.1404 L 4137.9623 3339.5304 L 4137.9623 3339.1204 L 4137.7623 3338.5004 L 4137.1523 3338.0904 L 4136.1223 3337.8904 L 4135.5123 3337.8904 L 4134.4923 3338.0904 L 4133.8723 3338.5004 L 4133.6723 3339.1204 L 4133.6723 3339.5304 M 4136.9423 3336.3404 L 4137.1523 3336.5404 L 4137.3523 3336.3404 L 4137.1523 3336.1304 L 4136.9423 3336.3404 M 4133.6723 3332.3304 L 4133.6723 3334.3704 L 4135.5123 3334.5804 L 4135.3123 3334.3704 L 4135.1023 3333.7604 L 4135.1023 3333.1404 L 4135.3123 3332.5304 L 4135.7123 3332.1204 L 4136.3323 3331.9204 L 4136.7423 3331.9204 L 4137.3523 3332.1204 L 4137.7623 3332.5304 L 4137.9623 3333.1404 L 4137.9623 3333.7604 L 4137.7623 3334.3704 L 4137.5623 3334.5804 L 4137.1523 3334.7804 M 4135.1023 3330.5704 L 4137.9623 3330.5704 M 4135.9223 3330.5704 L 4135.3123 3329.9504 L 4135.1023 3329.5404 L 4135.1023 3328.9304 L 4135.3123 3328.5204 L 4135.9223 3328.3204 L 4137.9623 3328.3204 M 4135.9223 3328.3204 L 4135.3123 3327.7004 L 4135.1023 3327.2904 L 4135.1023 3326.6804 L 4135.3123 3326.2704 L 4135.9223 3326.0704 L 4137.9623 3326.0704 M 4135.1023 3324.7204 L 4137.9623 3324.7204 M 4135.9223 3324.7204 L 4135.3123 3324.1004 L 4135.1023 3323.6904 L 4135.1023 3323.0804 L 4135.3123 3322.6704 L 4135.9223 3322.4704 L 4137.9623 3322.4704 M 4135.9223 3322.4704 L 4135.3123 3321.8504 L 4135.1023 3321.4404 L 4135.1023 3320.8304 L 4135.3123 3320.4204 L 4135.9223 3320.2204 L 4137.9623 3320.2204","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"text","svgpath":"M 4088.7235 3346.1968 L 4091.7935 3346.1968 L 4092.4035 3345.9968 L 4092.8135 3345.5868 L 4093.0135 3344.9668 L 4093.0135 3344.5568 L 4092.8135 3343.9468 L 4092.4035 3343.5368 L 4091.7935 3343.3368 L 4088.7235 3343.3368 M 4089.3335 3339.1168 L 4088.9235 3339.5268 L 4088.7235 3340.1468 L 4088.7235 3340.9568 L 4088.9235 3341.5768 L 4089.3335 3341.9868 L 4089.7435 3341.9868 L 4090.1535 3341.7768 L 4090.3635 3341.5768 L 4090.5635 3341.1668 L 4090.9735 3339.9368 L 4091.1735 3339.5268 L 4091.3835 3339.3268 L 4091.7935 3339.1168 L 4092.4035 3339.1168 L 4092.8135 3339.5268 L 4093.0135 3340.1468 L 4093.0135 3340.9568 L 4092.8135 3341.5768 L 4092.4035 3341.9868 M 4088.7235 3337.7668 L 4093.0135 3337.7668 M 4088.7235 3337.7668 L 4088.7235 3335.9268 L 4088.9235 3335.3168 L 4089.1335 3335.1068 L 4089.5435 3334.9068 L 4089.9535 3334.9068 L 4090.3635 3335.1068 L 4090.5635 3335.3168 L 4090.7635 3335.9268 M 4090.7635 3337.7668 L 4090.7635 3335.9268 L 4090.9735 3335.3168 L 4091.1735 3335.1068 L 4091.5835 3334.9068 L 4092.2035 3334.9068 L 4092.6135 3335.1068 L 4092.8135 3335.3168 L 4093.0135 3335.9268 L 4093.0135 3337.7668","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","ref":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.8,"svgpath":"M3998.1103,3311 3998.1103,3331 4028.1103,3331 4028.1103,3311 3998.1103,3311 4017.2773,3311"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.8,"svgpath":"M4028.1103,3321.0095 4018.1103,3321.0095 4018.1103,3311"},{"type":"text","svgpath":"M 3937.7303 3337.81 L 3937.7303 3342.1 M 3940.5903 3337.81 L 3940.5903 3342.1 M 3937.7303 3339.85 L 3940.5903 3339.85 M 3941.9403 3340.47 L 3944.4003 3340.47 L 3944.4003 3340.06 L 3944.1903 3339.65 L 3943.9903 3339.45 L 3943.5803 3339.24 L 3942.9703 3339.24 L 3942.5603 3339.45 L 3942.1503 3339.85 L 3941.9403 3340.47 L 3941.9403 3340.88 L 3942.1503 3341.49 L 3942.5603 3341.9 L 3942.9703 3342.1 L 3943.5803 3342.1 L 3943.9903 3341.9 L 3944.4003 3341.49 M 3948.2003 3339.24 L 3948.2003 3342.1 M 3948.2003 3339.85 L 3947.7903 3339.45 L 3947.3803 3339.24 L 3946.7703 3339.24 L 3946.3603 3339.45 L 3945.9503 3339.85 L 3945.7503 3340.47 L 3945.7503 3340.88 L 3945.9503 3341.49 L 3946.3603 3341.9 L 3946.7703 3342.1 L 3947.3803 3342.1 L 3947.7903 3341.9 L 3948.2003 3341.49 M 3952.0103 3337.81 L 3952.0103 3342.1 M 3952.0103 3339.85 L 3951.6003 3339.45 L 3951.1903 3339.24 L 3950.5803 3339.24 L 3950.1703 3339.45 L 3949.7603 3339.85 L 3949.5503 3340.47 L 3949.5503 3340.88 L 3949.7603 3341.49 L 3950.1703 3341.9 L 3950.5803 3342.1 L 3951.1903 3342.1 L 3951.6003 3341.9 L 3952.0103 3341.49 M 3953.3603 3340.47 L 3955.8103 3340.47 L 3955.8103 3340.06 L 3955.6103 3339.65 L 3955.4003 3339.45 L 3954.9903 3339.24 L 3954.3803 3339.24 L 3953.9703 3339.45 L 3953.5603 3339.85 L 3953.3603 3340.47 L 3953.3603 3340.88 L 3953.5603 3341.49 L 3953.9703 3341.9 L 3954.3803 3342.1 L 3954.9903 3342.1 L 3955.4003 3341.9 L 3955.8103 3341.49 M 3957.1603 3339.24 L 3957.1603 3342.1 M 3957.1603 3340.47 L 3957.3703 3339.85 L 3957.7803 3339.45 L 3958.1803 3339.24 L 3958.8003 3339.24 M 3960.1503 3340.26 L 3963.8303 3340.26 M 3965.1803 3337.81 L 3965.1803 3342.1 M 3965.1803 3337.81 L 3966.8203 3342.1 M 3968.4503 3337.81 L 3966.8203 3342.1 M 3968.4503 3337.81 L 3968.4503 3342.1 M 3972.2603 3339.24 L 3972.2603 3342.1 M 3972.2603 3339.85 L 3971.8503 3339.45 L 3971.4403 3339.24 L 3970.8303 3339.24 L 3970.4203 3339.45 L 3970.0103 3339.85 L 3969.8003 3340.47 L 3969.8003 3340.88 L 3970.0103 3341.49 L 3970.4203 3341.9 L 3970.8303 3342.1 L 3971.4403 3342.1 L 3971.8503 3341.9 L 3972.2603 3341.49 M 3973.6103 3337.81 L 3973.6103 3342.1 M 3974.9603 3340.47 L 3977.4103 3340.47 L 3977.4103 3340.06 L 3977.2103 3339.65 L 3977.0003 3339.45 L 3976.5903 3339.24 L 3975.9803 3339.24 L 3975.5703 3339.45 L 3975.1603 3339.85 L 3974.9603 3340.47 L 3974.9603 3340.88 L 3975.1603 3341.49 L 3975.5703 3341.9 L 3975.9803 3342.1 L 3976.5903 3342.1 L 3977.0003 3341.9 L 3977.4103 3341.49 M 3978.7603 3340.26 L 3982.4403 3340.26 M 3984.0003 3338.83 L 3984.0003 3338.63 L 3984.2003 3338.22 L 3984.4103 3338.01 L 3984.8203 3337.81 L 3985.6303 3337.81 L 3986.0403 3338.01 L 3986.2503 3338.22 L 3986.4503 3338.63 L 3986.4503 3339.04 L 3986.2503 3339.45 L 3985.8403 3340.06 L 3983.7903 3342.1 L 3986.6603 3342.1 M 3988.2103 3341.08 L 3988.0103 3341.29 L 3988.2103 3341.49 L 3988.4203 3341.29 L 3988.2103 3341.08 M 3992.2203 3337.81 L 3990.1803 3337.81 L 3989.9703 3339.65 L 3990.1803 3339.45 L 3990.7903 3339.24 L 3991.4003 3339.24 L 3992.0203 3339.45 L 3992.4303 3339.85 L 3992.6303 3340.47 L 3992.6303 3340.88 L 3992.4303 3341.49 L 3992.0203 3341.9 L 3991.4003 3342.1 L 3990.7903 3342.1 L 3990.1803 3341.9 L 3989.9703 3341.7 L 3989.7703 3341.29 M 3996.0303 3337.81 L 3993.9803 3340.67 L 3997.0503 3340.67 M 3996.0303 3337.81 L 3996.0303 3342.1 M 3998.4003 3343.54 L 4002.0803 3343.54 M 4003.6303 3338.83 L 4003.6303 3338.63 L 4003.8403 3338.22 L 4004.0403 3338.01 L 4004.4503 3337.81 L 4005.2703 3337.81 L 4005.6803 3338.01 L 4005.8803 3338.22 L 4006.0903 3338.63 L 4006.0903 3339.04 L 4005.8803 3339.45 L 4005.4803 3340.06 L 4003.4303 3342.1 L 4006.2903 3342.1 M 4007.6403 3339.24 L 4009.8903 3342.1 M 4009.8903 3339.24 L 4007.6403 3342.1 M 4011.6503 3337.81 L 4013.9003 3337.81 L 4012.6803 3339.45 L 4013.2903 3339.45 L 4013.7003 3339.65 L 4013.9003 3339.85 L 4014.1103 3340.47 L 4014.1103 3340.88 L 4013.9003 3341.49 L 4013.4903 3341.9 L 4012.8803 3342.1 L 4012.2703 3342.1 L 4011.6503 3341.9 L 4011.4503 3341.7 L 4011.2403 3341.29","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"text","svgpath":"M 3992.0543 3327.9825 L 3991.6443 3328.3925 L 3991.4443 3329.0025 L 3991.4443 3329.8225 L 3991.6443 3330.4325 L 3992.0543 3330.8425 L 3992.4643 3330.8425 L 3992.8743 3330.6425 L 3993.0843 3330.4325 L 3993.2843 3330.0225 L 3993.6943 3328.7925 L 3993.8943 3328.3925 L 3994.1043 3328.1825 L 3994.5143 3327.9825 L 3995.1243 3327.9825 L 3995.5343 3328.3925 L 3995.7343 3329.0025 L 3995.7343 3329.8225 L 3995.5343 3330.4325 L 3995.1243 3330.8425 M 3991.4443 3326.6325 L 3995.7343 3326.6325 M 3991.4443 3326.6325 L 3991.4443 3323.9725 M 3993.4843 3326.6325 L 3993.4843 3324.9925 M 3995.7343 3326.6325 L 3995.7343 3323.9725 M 3991.4443 3322.6225 L 3995.7343 3322.6225 M 3991.4443 3322.6225 L 3991.4443 3320.7825 L 3991.6443 3320.1625 L 3991.8543 3319.9625 L 3992.2643 3319.7525 L 3992.6743 3319.7525 L 3993.0843 3319.9625 L 3993.2843 3320.1625 L 3993.4843 3320.7825 L 3993.4843 3322.6225 M 3993.4843 3321.1925 L 3995.7343 3319.7525 M 3991.4443 3318.4025 L 3995.7343 3316.7725 M 3991.4443 3315.1325 L 3995.7343 3316.7725 M 3991.4443 3312.5525 L 3991.6443 3312.9625 L 3992.0543 3313.3725 L 3992.4643 3313.5825 L 3993.0843 3313.7825 L 3994.1043 3313.7825 L 3994.7143 3313.5825 L 3995.1243 3313.3725 L 3995.5343 3312.9625 L 3995.7343 3312.5525 L 3995.7343 3311.7425 L 3995.5343 3311.3325 L 3995.1243 3310.9225 L 3994.7143 3310.7125 L 3994.1043 3310.5125 L 3993.0843 3310.5125 L 3992.4643 3310.7125 L 3992.0543 3310.9225 L 3991.6443 3311.3325 L 3991.4443 3311.7425 L 3991.4443 3312.5525","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","ref":1},{"type":"text","svgpath":"M 3929.117 3306.9566 L 3932.007 3306.9566 M 3930.567 3308.4066 L 3930.567 3305.5066 M 3928.627 3302.5066 L 3928.627 3304.1166 L 3930.077 3304.2766 L 3929.917 3304.1166 L 3929.757 3303.6366 L 3929.757 3303.1466 L 3929.917 3302.6666 L 3930.237 3302.3466 L 3930.727 3302.1866 L 3931.047 3302.1866 L 3931.527 3302.3466 L 3931.847 3302.6666 L 3932.007 3303.1466 L 3932.007 3303.6366 L 3931.847 3304.1166 L 3931.687 3304.2766 L 3931.367 3304.4366 M 3928.627 3301.1266 L 3932.007 3299.8366 M 3928.627 3298.5466 L 3932.007 3299.8366","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3938.5658 3306.9566 L 3941.4558 3306.9566 M 3940.0158 3308.4066 L 3940.0158 3305.5066 M 3938.0758 3302.5066 L 3938.0758 3304.1166 L 3939.5258 3304.2766 L 3939.3658 3304.1166 L 3939.2058 3303.6366 L 3939.2058 3303.1466 L 3939.3658 3302.6666 L 3939.6858 3302.3466 L 3940.1758 3302.1866 L 3940.4958 3302.1866 L 3940.9758 3302.3466 L 3941.2958 3302.6666 L 3941.4558 3303.1466 L 3941.4558 3303.6366 L 3941.2958 3304.1166 L 3941.1358 3304.2766 L 3940.8158 3304.4366 M 3938.0758 3301.1266 L 3941.4558 3299.8366 M 3938.0758 3298.5466 L 3941.4558 3299.8366","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3968.3955 3308.4064 L 3971.7755 3308.4064 M 3967.7455 3304.4464 L 3972.9055 3307.3364 M 3968.3955 3302.4164 L 3968.5555 3302.7364 L 3968.8755 3303.0564 L 3969.1955 3303.2164 L 3969.6855 3303.3764 L 3970.4855 3303.3764 L 3970.9655 3303.2164 L 3971.2955 3303.0564 L 3971.6155 3302.7364 L 3971.7755 3302.4164 L 3971.7755 3301.7664 L 3971.6155 3301.4464 L 3971.2955 3301.1264 L 3970.9655 3300.9664 L 3970.4855 3300.8064 L 3969.6855 3300.8064 L 3969.1955 3300.9664 L 3968.8755 3301.1264 L 3968.5555 3301.4464 L 3968.3955 3301.7664 L 3968.3955 3302.4164 M 3968.3955 3295.3264 L 3968.3955 3296.9364 L 3969.8455 3297.0964 L 3969.6855 3296.9364 L 3969.5255 3296.4564 L 3969.5255 3295.9664 L 3969.6855 3295.4864 L 3970.0055 3295.1664 L 3970.4855 3295.0064 L 3970.8055 3295.0064 L 3971.2955 3295.1664 L 3971.6155 3295.4864 L 3971.7755 3295.9664 L 3971.7755 3296.4564 L 3971.6155 3296.9364 L 3971.4555 3297.0964 L 3971.1355 3297.2564","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3948.312 3308.4065 L 3951.692 3308.4065 M 3947.672 3304.4465 L 3952.822 3307.3365 M 3948.312 3302.4165 L 3948.472 3302.7365 L 3948.802 3303.0565 L 3949.122 3303.2165 L 3949.602 3303.3765 L 3950.412 3303.3765 L 3950.892 3303.2165 L 3951.212 3303.0565 L 3951.532 3302.7365 L 3951.692 3302.4165 L 3951.692 3301.7665 L 3951.532 3301.4465 L 3951.212 3301.1265 L 3950.892 3300.9665 L 3950.412 3300.8065 L 3949.602 3300.8065 L 3949.122 3300.9665 L 3948.802 3301.1265 L 3948.472 3301.4465 L 3948.312 3301.7665 L 3948.312 3302.4165 M 3948.962 3297.2565 L 3948.802 3296.9365 L 3948.312 3296.4565 L 3951.692 3296.4565","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3958.5519 3308.4066 L 3961.9319 3308.4066 M 3957.9019 3304.4466 L 3963.0619 3307.3466 M 3958.5519 3302.4166 L 3958.7119 3302.7466 L 3959.0319 3303.0666 L 3959.3519 3303.2266 L 3959.8419 3303.3866 L 3960.6419 3303.3866 L 3961.1319 3303.2266 L 3961.4519 3303.0666 L 3961.7719 3302.7466 L 3961.9319 3302.4166 L 3961.9319 3301.7766 L 3961.7719 3301.4566 L 3961.4519 3301.1366 L 3961.1319 3300.9666 L 3960.6419 3300.8066 L 3959.8419 3300.8066 L 3959.3519 3300.9666 L 3959.0319 3301.1366 L 3958.7119 3301.4566 L 3958.5519 3301.7766 L 3958.5519 3302.4166 M 3958.5519 3296.9466 L 3958.5519 3295.1766 L 3959.8419 3296.1366 L 3959.8419 3295.6566 L 3960.0019 3295.3366 L 3960.1619 3295.1766 L 3960.6419 3295.0066 L 3960.9619 3295.0066 L 3961.4519 3295.1766 L 3961.7719 3295.4966 L 3961.9319 3295.9766 L 3961.9319 3296.4566 L 3961.7719 3296.9466 L 3961.6119 3297.1066 L 3961.2919 3297.2666","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3948.312 3346.8931 L 3951.692 3346.8931 M 3947.672 3342.9331 L 3952.822 3345.8331 M 3948.312 3340.9031 L 3948.472 3341.2231 L 3948.802 3341.5531 L 3949.122 3341.7131 L 3949.602 3341.8731 L 3950.412 3341.8731 L 3950.892 3341.7131 L 3951.212 3341.5531 L 3951.532 3341.2231 L 3951.692 3340.9031 L 3951.692 3340.2631 L 3951.532 3339.9431 L 3951.212 3339.6131 L 3950.892 3339.4531 L 3950.412 3339.2931 L 3949.602 3339.2931 L 3949.122 3339.4531 L 3948.802 3339.6131 L 3948.472 3339.9431 L 3948.312 3340.2631 L 3948.312 3340.9031 M 3948.312 3334.7831 L 3948.472 3335.2731 L 3948.962 3335.5931 L 3949.762 3335.7531 L 3950.252 3335.7531 L 3951.052 3335.5931 L 3951.532 3335.2731 L 3951.692 3334.7831 L 3951.692 3334.4631 L 3951.532 3333.9831 L 3951.052 3333.6531 L 3950.252 3333.4931 L 3949.762 3333.4931 L 3948.962 3333.6531 L 3948.472 3333.9831 L 3948.312 3334.4631 L 3948.312 3334.7831","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3958.5519 3346.8931 L 3961.9319 3346.8931 M 3957.9019 3342.9331 L 3963.0619 3345.8331 M 3958.5519 3340.9031 L 3958.7119 3341.2231 L 3959.0319 3341.5431 L 3959.3519 3341.7031 L 3959.8419 3341.8731 L 3960.6419 3341.8731 L 3961.1319 3341.7031 L 3961.4519 3341.5431 L 3961.7719 3341.2231 L 3961.9319 3340.9031 L 3961.9319 3340.2531 L 3961.7719 3339.9331 L 3961.4519 3339.6131 L 3961.1319 3339.4531 L 3960.6419 3339.2931 L 3959.8419 3339.2931 L 3959.3519 3339.4531 L 3959.0319 3339.6131 L 3958.7119 3339.9331 L 3958.5519 3340.2531 L 3958.5519 3340.9031 M 3959.3519 3335.5831 L 3959.1919 3335.5831 L 3958.8719 3335.4231 L 3958.7119 3335.2631 L 3958.5519 3334.9431 L 3958.5519 3334.3031 L 3958.7119 3333.9731 L 3958.8719 3333.8131 L 3959.1919 3333.6531 L 3959.5219 3333.6531 L 3959.8419 3333.8131 L 3960.3219 3334.1331 L 3961.9319 3335.7431 L 3961.9319 3333.4931","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3968.397 3347.0531 L 3971.777 3347.0531 M 3967.747 3343.0931 L 3972.907 3345.9931 M 3968.397 3341.0631 L 3968.557 3341.3831 L 3968.877 3341.7031 L 3969.197 3341.8631 L 3969.677 3342.0331 L 3970.487 3342.0331 L 3970.967 3341.8631 L 3971.297 3341.7031 L 3971.617 3341.3831 L 3971.777 3341.0631 L 3971.777 3340.4131 L 3971.617 3340.0931 L 3971.297 3339.7731 L 3970.967 3339.6131 L 3970.487 3339.4531 L 3969.677 3339.4531 L 3969.197 3339.6131 L 3968.877 3339.7731 L 3968.557 3340.0931 L 3968.397 3340.4131 L 3968.397 3341.0631 M 3968.397 3334.2931 L 3970.647 3335.9131 L 3970.647 3333.4931 M 3968.397 3334.2931 L 3971.777 3334.2931","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3928.7166 3345.2232 L 3931.6166 3345.2232 M 3930.1666 3346.6732 L 3930.1666 3343.7732 M 3928.2366 3342.3832 L 3928.2366 3340.6132 L 3929.5266 3341.5832 L 3929.5266 3341.0932 L 3929.6866 3340.7732 L 3929.8466 3340.6132 L 3930.3266 3340.4532 L 3930.6466 3340.4532 L 3931.1366 3340.6132 L 3931.4566 3340.9332 L 3931.6166 3341.4132 L 3931.6166 3341.9032 L 3931.4566 3342.3832 L 3931.2966 3342.5432 L 3930.9766 3342.7032 M 3928.2366 3339.3932 L 3931.6166 3338.1032 M 3928.2366 3336.8132 L 3931.6166 3338.1032 M 3928.2366 3335.4232 L 3928.2366 3333.6532 L 3929.5266 3334.6232 L 3929.5266 3334.1332 L 3929.6866 3333.8132 L 3929.8466 3333.6532 L 3930.3266 3333.4932 L 3930.6466 3333.4932 L 3931.1366 3333.6532 L 3931.4566 3333.9732 L 3931.6166 3334.4632 L 3931.6166 3334.9432 L 3931.4566 3335.4232 L 3931.2966 3335.5832 L 3930.9766 3335.7532","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3938.9528 3345.2232 L 3941.8528 3345.2232 M 3940.4028 3346.6732 L 3940.4028 3343.7732 M 3938.4728 3342.3832 L 3938.4728 3340.6132 L 3939.7628 3341.5832 L 3939.7628 3341.0932 L 3939.9228 3340.7732 L 3940.0828 3340.6132 L 3940.5628 3340.4532 L 3940.8828 3340.4532 L 3941.3728 3340.6132 L 3941.6928 3340.9332 L 3941.8528 3341.4132 L 3941.8528 3341.9032 L 3941.6928 3342.3832 L 3941.5328 3342.5432 L 3941.2128 3342.7032 M 3938.4728 3339.3932 L 3941.8528 3338.1032 M 3938.4728 3336.8132 L 3941.8528 3338.1032 M 3938.4728 3335.4232 L 3938.4728 3333.6532 L 3939.7628 3334.6232 L 3939.7628 3334.1332 L 3939.9228 3333.8132 L 3940.0828 3333.6532 L 3940.5628 3333.4932 L 3940.8828 3333.4932 L 3941.3728 3333.6532 L 3941.6928 3333.9732 L 3941.8528 3334.4632 L 3941.8528 3334.9432 L 3941.6928 3335.4232 L 3941.5328 3335.5832 L 3941.2128 3335.7532","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3979.0406 3305.9866 L 3978.7206 3306.1466 L 3978.4006 3306.4666 L 3978.2306 3306.7866 L 3978.2306 3307.4366 L 3978.4006 3307.7566 L 3978.7206 3308.0766 L 3979.0406 3308.2366 L 3979.5206 3308.4066 L 3980.3306 3308.4066 L 3980.8106 3308.2366 L 3981.1306 3308.0766 L 3981.4606 3307.7566 L 3981.6206 3307.4366 L 3981.6206 3306.7866 L 3981.4606 3306.4666 L 3981.1306 3306.1466 L 3980.8106 3305.9866 L 3980.3306 3305.9866 M 3980.3306 3306.7866 L 3980.3306 3305.9866 M 3978.2306 3304.9266 L 3981.6206 3304.9266 M 3978.2306 3304.9266 L 3981.6206 3302.6666 M 3978.2306 3302.6666 L 3981.6206 3302.6666 M 3978.2306 3301.6066 L 3981.6206 3301.6066 M 3978.2306 3301.6066 L 3978.2306 3300.4766 L 3978.4006 3299.9966 L 3978.7206 3299.6766 L 3979.0406 3299.5066 L 3979.5206 3299.3466 L 3980.3306 3299.3466 L 3980.8106 3299.5066 L 3981.1306 3299.6766 L 3981.4606 3299.9966 L 3981.6206 3300.4766 L 3981.6206 3301.6066","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 3979.0406 3340.1331 L 3978.7206 3340.2931 L 3978.4006 3340.6131 L 3978.2306 3340.9331 L 3978.2306 3341.5831 L 3978.4006 3341.9031 L 3978.7206 3342.2231 L 3979.0406 3342.3831 L 3979.5206 3342.5531 L 3980.3306 3342.5531 L 3980.8106 3342.3831 L 3981.1306 3342.2231 L 3981.4606 3341.9031 L 3981.6206 3341.5831 L 3981.6206 3340.9331 L 3981.4606 3340.6131 L 3981.1306 3340.2931 L 3980.8106 3340.1331 L 3980.3306 3340.1331 M 3980.3306 3340.9331 L 3980.3306 3340.1331 M 3978.2306 3339.0731 L 3981.6206 3339.0731 M 3978.2306 3339.0731 L 3981.6206 3336.8131 M 3978.2306 3336.8131 L 3981.6206 3336.8131 M 3978.2306 3335.7531 L 3981.6206 3335.7531 M 3978.2306 3335.7531 L 3978.2306 3334.6231 L 3978.4006 3334.1431 L 3978.7206 3333.8231 L 3979.0406 3333.6531 L 3979.5206 3333.4931 L 3980.3306 3333.4931 L 3980.8106 3333.6531 L 3981.1306 3333.8231 L 3981.4606 3334.1431 L 3981.6206 3334.6231 L 3981.6206 3335.7531","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 4001.0345 3308.4065 L 4004.4145 3308.4065 M 4001.0345 3308.4065 L 4001.0345 3306.9565 L 4001.1945 3306.4765 L 4001.3545 3306.3165 L 4001.6845 3306.1565 L 4002.1645 3306.1565 L 4002.4845 3306.3165 L 4002.6445 3306.4765 L 4002.8045 3306.9565 L 4002.8045 3308.4065 M 4001.0345 3305.0965 L 4004.4145 3304.2865 M 4001.0345 3303.4865 L 4004.4145 3304.2865 M 4001.0345 3303.4865 L 4004.4145 3302.6765 M 4001.0345 3301.8765 L 4004.4145 3302.6765 M 4001.0345 3300.8065 L 4004.4145 3300.8065 M 4001.0345 3300.8065 L 4004.4145 3299.5165 M 4001.0345 3298.2365 L 4004.4145 3299.5165 M 4001.0345 3298.2365 L 4004.4145 3298.2365 M 4001.0345 3296.2065 L 4001.1945 3296.6865 L 4001.6845 3297.0065 L 4002.4845 3297.1665 L 4002.9745 3297.1665 L 4003.7745 3297.0065 L 4004.2545 3296.6865 L 4004.4145 3296.2065 L 4004.4145 3295.8765 L 4004.2545 3295.3965 L 4003.7745 3295.0765 L 4002.9745 3294.9165 L 4002.4845 3294.9165 L 4001.6845 3295.0765 L 4001.1945 3295.3965 L 4001.0345 3295.8765 L 4001.0345 3296.2065","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 4001.0335 3345.5331 L 4004.4235 3345.5331 M 4001.0335 3345.5331 L 4001.0335 3344.0831 L 4001.1935 3343.6031 L 4001.3635 3343.4431 L 4001.6835 3343.2831 L 4002.1635 3343.2831 L 4002.4835 3343.4431 L 4002.6435 3343.6031 L 4002.8135 3344.0831 L 4002.8135 3345.5331 M 4001.0335 3342.2231 L 4004.4235 3341.4131 M 4001.0335 3340.6131 L 4004.4235 3341.4131 M 4001.0335 3340.6131 L 4004.4235 3339.8031 M 4001.0335 3339.0031 L 4004.4235 3339.8031 M 4001.0335 3337.9331 L 4004.4235 3337.9331 M 4001.0335 3337.9331 L 4004.4235 3336.6431 M 4001.0335 3335.3631 L 4004.4235 3336.6431 M 4001.0335 3335.3631 L 4004.4235 3335.3631 M 4001.6835 3334.2931 L 4001.5235 3333.9731 L 4001.0335 3333.4931 L 4004.4235 3333.4931","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 4012.0245 3341.9031 L 4014.9145 3341.9031 M 4013.4745 3343.3531 L 4013.4745 3340.4531 M 4011.5345 3337.4531 L 4011.5345 3339.0631 L 4012.9845 3339.2231 L 4012.8245 3339.0631 L 4012.6645 3338.5831 L 4012.6645 3338.0931 L 4012.8245 3337.6131 L 4013.1445 3337.2931 L 4013.6345 3337.1331 L 4013.9545 3337.1331 L 4014.4345 3337.2931 L 4014.7545 3337.6131 L 4014.9145 3338.0931 L 4014.9145 3338.5831 L 4014.7545 3339.0631 L 4014.5945 3339.2231 L 4014.2745 3339.3831 M 4011.5345 3336.0731 L 4014.9145 3334.7831 M 4011.5345 3333.4931 L 4014.9145 3334.7831","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 4011.794 3306.9565 L 4014.684 3306.9565 M 4013.244 3308.4065 L 4013.244 3305.5065 M 4011.304 3302.5065 L 4011.304 3304.1165 L 4012.754 3304.2765 L 4012.594 3304.1165 L 4012.434 3303.6365 L 4012.434 3303.1465 L 4012.594 3302.6665 L 4012.914 3302.3465 L 4013.404 3302.1865 L 4013.724 3302.1865 L 4014.204 3302.3465 L 4014.524 3302.6665 L 4014.684 3303.1465 L 4014.684 3303.6365 L 4014.524 3304.1165 L 4014.364 3304.2765 L 4014.044 3304.4365 M 4011.304 3301.1265 L 4014.684 3299.8365 M 4011.304 3298.5465 L 4014.684 3299.8365","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 4021.9539 3305.9864 L 4021.6339 3306.1464 L 4021.3139 3306.4664 L 4021.1439 3306.7864 L 4021.1439 3307.4364 L 4021.3139 3307.7564 L 4021.6339 3308.0764 L 4021.9539 3308.2364 L 4022.4339 3308.4064 L 4023.2439 3308.4064 L 4023.7239 3308.2364 L 4024.0439 3308.0764 L 4024.3739 3307.7564 L 4024.5339 3307.4364 L 4024.5339 3306.7864 L 4024.3739 3306.4664 L 4024.0439 3306.1464 L 4023.7239 3305.9864 L 4023.2439 3305.9864 M 4023.2439 3306.7864 L 4023.2439 3305.9864 M 4021.1439 3304.9264 L 4024.5339 3304.9264 M 4021.1439 3304.9264 L 4024.5339 3302.6664 M 4021.1439 3302.6664 L 4024.5339 3302.6664 M 4021.1439 3301.6064 L 4024.5339 3301.6064 M 4021.1439 3301.6064 L 4021.1439 3300.4764 L 4021.3139 3299.9964 L 4021.6339 3299.6764 L 4021.9539 3299.5064 L 4022.4339 3299.3464 L 4023.2439 3299.3464 L 4023.7239 3299.5064 L 4024.0439 3299.6764 L 4024.3739 3299.9964 L 4024.5339 3300.4764 L 4024.5339 3301.6064","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""},{"type":"text","svgpath":"M 4022.3476 3340.1331 L 4022.0276 3340.2931 L 4021.7076 3340.6131 L 4021.5376 3340.9331 L 4021.5376 3341.5831 L 4021.7076 3341.9031 L 4022.0276 3342.2231 L 4022.3476 3342.3831 L 4022.8276 3342.5531 L 4023.6376 3342.5531 L 4024.1176 3342.3831 L 4024.4376 3342.2231 L 4024.7676 3341.9031 L 4024.9276 3341.5831 L 4024.9276 3340.9331 L 4024.7676 3340.6131 L 4024.4376 3340.2931 L 4024.1176 3340.1331 L 4023.6376 3340.1331 M 4023.6376 3340.9331 L 4023.6376 3340.1331 M 4021.5376 3339.0731 L 4024.9276 3339.0731 M 4021.5376 3339.0731 L 4024.9276 3336.8131 M 4021.5376 3336.8131 L 4024.9276 3336.8131 M 4021.5376 3335.7531 L 4024.9276 3335.7531 M 4021.5376 3335.7531 L 4021.5376 3334.6231 L 4021.7076 3334.1431 L 4022.0276 3333.8231 L 4022.3476 3333.6531 L 4022.8276 3333.4931 L 4023.6376 3333.4931 L 4024.1176 3333.6531 L 4024.4376 3333.8231 L 4024.7676 3334.1431 L 4024.9276 3334.6231 L 4024.9276 3335.7531","useTrueTypeFontRendering":false,"thickness":0.7087,"width":0.7087,"net":""}],"B":[{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4084.8774,3302.4965 4092.2441,3302.4965 4092.2441,3306.6014"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4036.9286,3306.6014 4036.9286,3302.4965 4044.4752,3302.4965"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4036.9286,3320.5064 4092.4404,3320.5064"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4036.9286,3320.5064 4036.9286,3316.3013"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4092.4404,3316.3013 4092.4404,3320.5064"},{"type":"text","svgpath":"M 4124.2881 3329.258 L 4124.2881 3333.548 M 4125.718 3329.258 L 4122.8581 3329.258 M 4121.508 3329.258 L 4121.508 3333.548 M 4118.638 3329.258 L 4118.638 3333.548 M 4121.508 3331.298 L 4118.638 3331.298 M 4117.2881 3329.258 L 4117.2881 3333.548 M 4117.2881 3329.258 L 4115.8581 3329.258 L 4115.248 3329.458 L 4114.838 3329.868 L 4114.628 3330.278 L 4114.428 3330.898 L 4114.428 3331.918 L 4114.628 3332.528 L 4114.838 3332.938 L 4115.248 3333.348 L 4115.8581 3333.548 L 4117.2881 3333.548 M 4111.848 3329.258 L 4112.468 3329.458 L 4112.8681 3330.078 L 4113.0781 3331.098 L 4113.0781 3331.708 L 4112.8681 3332.738 L 4112.468 3333.348 L 4111.848 3333.548 L 4111.4381 3333.548 L 4110.8281 3333.348 L 4110.418 3332.738 L 4110.218 3331.708 L 4110.218 3331.098 L 4110.418 3330.078 L 4110.8281 3329.458 L 4111.4381 3329.258 L 4111.848 3329.258 M 4106.4081 3329.258 L 4108.458 3329.258 L 4108.6581 3331.098 L 4108.458 3330.898 L 4107.838 3330.688 L 4107.2281 3330.688 L 4106.6181 3330.898 L 4106.208 3331.298 L 4105.998 3331.918 L 4105.998 3332.328 L 4106.208 3332.938 L 4106.6181 3333.348 L 4107.2281 3333.548 L 4107.838 3333.548 L 4108.458 3333.348 L 4108.6581 3333.148 L 4108.8681 3332.738 M 4104.6481 3330.078 L 4104.2381 3329.868 L 4103.628 3329.258 L 4103.628 3333.548 M 4099.8181 3329.258 L 4101.868 3329.258 L 4102.0681 3331.098 L 4101.868 3330.898 L 4101.2581 3330.688 L 4100.638 3330.688 L 4100.0281 3330.898 L 4099.618 3331.298 L 4099.4181 3331.918 L 4099.4181 3332.328 L 4099.618 3332.938 L 4100.0281 3333.348 L 4100.638 3333.548 L 4101.2581 3333.548 L 4101.868 3333.348 L 4102.0681 3333.148 L 4102.2781 3332.738 M 4098.0681 3331.708 L 4094.3781 3331.708 M 4092.828 3330.278 L 4092.828 3330.078 L 4092.618 3329.668 L 4092.4181 3329.458 L 4092.0081 3329.258 L 4091.1881 3329.258 L 4090.7781 3329.458 L 4090.578 3329.668 L 4090.368 3330.078 L 4090.368 3330.488 L 4090.578 3330.898 L 4090.988 3331.508 L 4093.0281 3333.548 L 4090.1681 3333.548 M 4087.5881 3329.258 L 4088.2081 3329.458 L 4088.618 3330.078 L 4088.8181 3331.098 L 4088.8181 3331.708 L 4088.618 3332.738 L 4088.2081 3333.348 L 4087.5881 3333.548 L 4087.178 3333.548 L 4086.5681 3333.348 L 4086.158 3332.738 L 4085.9581 3331.708 L 4085.9581 3331.098 L 4086.158 3330.078 L 4086.5681 3329.458 L 4087.178 3329.258 L 4087.5881 3329.258 M 4081.5381 3330.278 L 4081.738 3329.868 L 4082.1481 3329.458 L 4082.5581 3329.258 L 4083.3781 3329.258 L 4083.7881 3329.458 L 4084.198 3329.868 L 4084.3981 3330.278 L 4084.6081 3330.898 L 4084.6081 3331.918 L 4084.3981 3332.528 L 4084.198 3332.938 L 4083.7881 3333.348 L 4083.3781 3333.548 L 4082.5581 3333.548 L 4082.1481 3333.348 L 4081.738 3332.938 L 4081.5381 3332.528 M 4080.1881 3329.258 L 4080.1881 3333.548 M 4080.1881 3333.548 L 4077.7281 3333.548 M 4076.3781 3331.708 L 4072.698 3331.708 M 4068.488 3329.868 L 4068.8981 3329.458 L 4069.5081 3329.258 L 4070.328 3329.258 L 4070.9381 3329.458 L 4071.348 3329.868 L 4071.348 3330.278 L 4071.1481 3330.688 L 4070.9381 3330.898 L 4070.5281 3331.098 L 4069.3081 3331.508 L 4068.8981 3331.708 L 4068.6881 3331.918 L 4068.488 3332.328 L 4068.488 3332.938 L 4068.8981 3333.348 L 4069.5081 3333.548 L 4070.328 3333.548 L 4070.9381 3333.348 L 4071.348 3332.938 M 4067.138 3329.258 L 4067.138 3333.548 M 4067.138 3329.258 L 4064.2681 3333.548 M 4064.2681 3329.258 L 4064.2681 3333.548","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"text","svgpath":"M 4058.044 3314.1227 L 4058.044 3309.8327 M 4056.6141 3314.1227 L 4059.4741 3314.1227 M 4060.8241 3314.1227 L 4060.8241 3309.8327 M 4060.8241 3314.1227 L 4062.6641 3314.1227 L 4063.2841 3313.9227 L 4063.484 3313.7127 L 4063.694 3313.3027 L 4063.694 3312.6927 L 4063.484 3312.2827 L 4063.2841 3312.0827 L 4062.6641 3311.8727 L 4060.8241 3311.8727 M 4065.044 3314.1227 L 4065.044 3309.8327 M 4065.044 3314.1227 L 4067.9041 3309.8327 M 4067.9041 3314.1227 L 4067.9041 3309.8327 M 4069.254 3314.1227 L 4069.254 3309.8327 M 4069.254 3309.8327 L 4071.714 3309.8327","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","ref":1},{"type":"circle","_svgpath":"M 4138, 3345.319 m -9.055, 0 a 9.055,9.055 0 1,0 18.11,0 a 9.055,9.055 0 1,0 -18.11,0","start":[4138,3345.319],"radius":9.055,"width":"1.1811","net":""},{"type":"circle","_svgpath":"M 3901.78, 3345.319 m -9.055, 0 a 9.055,9.055 0 1,0 18.11,0 a 9.055,9.055 0 1,0 -18.11,0","start":[3901.78,3345.319],"radius":9.055,"width":"1.1811","net":""},{"type":"circle","_svgpath":"M 3901.78, 3296.5 m -9.055, 0 a 9.055,9.055 0 1,0 18.11,0 a 9.055,9.055 0 1,0 -18.11,0","start":[3901.78,3296.5],"radius":9.055,"width":"1.1811","net":""},{"type":"circle","_svgpath":"M 4138, 3296.5 m -9.055, 0 a 9.055,9.055 0 1,0 18.11,0 a 9.055,9.055 0 1,0 -18.11,0","start":[4138,3296.5],"radius":9.055,"width":"1.1811","net":""},{"type":"polygon","svgpath":"M 4062.5524 3345.56 C 4062.4046 3345.4309 4062.402 3345.3412 4062.402 3340.2473 L 4062.402 3335.066 L 4059.7407 3335.0472 C 4057.2461 3335.0296 4057.0695 3335.0206 4056.9213 3334.9034 C 4056.5516 3334.6113 4056.4565 3334.7066 4061.5944 3330.2226 C 4065.3914 3326.9089 4066.4657 3326.0061 4066.6125 3326.0061 C 4066.7591 3326.0061 4067.8335 3326.9089 4071.6304 3330.2226 C 4076.7684 3334.7066 4076.6733 3334.6113 4076.3036 3334.9034 C 4076.1553 3335.0206 4075.9788 3335.0296 4073.4841 3335.0472 L 4070.8228 3335.066 L 4070.8228 3340.2764 L 4070.8228 3345.4869 L 4070.6558 3345.589 C 4070.5097 3345.6783 4069.9974 3345.6911 4066.5957 3345.6911 C 4062.803 3345.6911 4062.6989 3345.6878 4062.5524 3345.56"},{"type":"text","svgpath":"M 3955.6151 3342.0073 C 3956.1551 3342.0073 3956.6351 3342.1373 3957.0951 3342.4073 L 3956.9351 3342.7573 C 3956.5751 3342.5473 3956.1351 3342.3973 3955.6551 3342.3973 C 3954.3151 3342.3973 3953.3251 3343.2773 3953.3251 3344.7973 C 3953.3251 3346.6373 3954.6751 3347.8273 3956.0651 3347.8273 C 3957.4651 3347.8273 3958.2351 3346.9173 3958.2351 3345.6373 C 3958.2351 3344.5973 3957.6551 3343.9973 3957.1651 3343.9973 C 3956.7251 3343.9973 3956.5751 3344.2973 3956.7351 3344.9373 L 3957.0351 3346.4773 L 3956.6451 3346.4773 L 3956.5651 3346.1573 L 3956.5551 3346.1573 C 3956.4051 3346.4173 3956.1851 3346.5373 3955.9251 3346.5373 C 3955.0051 3346.5373 3954.4351 3345.5573 3954.4351 3344.7473 C 3954.4351 3344.0373 3954.8351 3343.6473 3955.3551 3343.6473 C 3955.7051 3343.6473 3956.0451 3343.8873 3956.3051 3344.1873 L 3956.3251 3344.1873 C 3956.3751 3343.7873 3956.6951 3343.5973 3957.1151 3343.5973 C 3957.8151 3343.5973 3958.6451 3344.3073 3958.6451 3345.6573 C 3958.6451 3347.1773 3957.6751 3348.2173 3956.1151 3348.2173 C 3954.3951 3348.2173 3952.8951 3346.8573 3952.8951 3344.7773 C 3952.8951 3342.9873 3954.0851 3342.0073 3955.6151 3342.0073 Z  M 3955.4651 3344.0473 C 3955.1351 3344.0473 3954.8951 3344.2573 3954.8951 3344.7773 C 3954.8951 3345.3773 3955.2851 3346.1273 3955.9151 3346.1273 C 3956.1351 3346.1273 3956.2851 3346.0473 3956.4451 3345.7973 L 3956.2151 3344.5273 C 3955.9351 3344.1873 3955.6951 3344.0473 3955.4651 3344.0473 Z  M 3959.7051 3343.1973 L 3960.2751 3343.1973 L 3960.2751 3345.6573 C 3960.5351 3346.3173 3960.9251 3346.5573 3961.2451 3346.5573 C 3961.3951 3346.5573 3961.4851 3346.5373 3961.6051 3346.4973 L 3961.7151 3346.9873 C 3961.5951 3347.0573 3961.4851 3347.0773 3961.3151 3347.0773 C 3960.8951 3347.0773 3960.5051 3346.7573 3960.2451 3346.2873 L 3960.2251 3346.2873 L 3960.1751 3346.9773 L 3959.7051 3346.9773 Z  M 3963.7251 3343.1073 C 3964.6551 3343.1073 3965.4751 3343.8373 3965.4751 3345.0873 C 3965.4751 3346.3473 3964.6551 3347.0773 3963.7251 3347.0773 C 3962.8051 3347.0773 3961.9951 3346.3473 3961.9951 3345.0873 C 3961.9951 3343.8373 3962.8051 3343.1073 3963.7251 3343.1073 Z  M 3963.7251 3343.5873 C 3963.0451 3343.5873 3962.5751 3344.1873 3962.5751 3345.0873 C 3962.5751 3345.9873 3963.0451 3346.5873 3963.7251 3346.5873 C 3964.4051 3346.5873 3964.8851 3345.9873 3964.8851 3345.0873 C 3964.8851 3344.1873 3964.4051 3343.5873 3963.7251 3343.5873 Z  M 3968.1151 3343.1073 C 3968.9951 3343.1073 3969.7651 3343.8573 3969.7651 3345.1473 C 3969.7651 3346.3073 3969.2451 3347.0773 3968.2551 3347.0773 C 3967.8251 3347.0773 3967.3951 3346.8273 3967.0351 3346.5273 L 3967.0651 3347.2273 L 3967.0651 3348.7673 L 3966.4951 3348.7673 L 3966.4951 3343.1973 L 3966.9451 3343.1973 L 3967.0151 3343.5873 L 3967.0251 3343.5873 C 3967.3651 3343.2873 3967.7651 3343.1073 3968.1151 3343.1073 Z  M 3968.0351 3343.5873 C 3967.7751 3343.5873 3967.4151 3343.6973 3967.0651 3343.9973 L 3967.0651 3346.0473 C 3967.4451 3346.4073 3967.7951 3346.5873 3968.1251 3346.5873 C 3968.8751 3346.5873 3969.1751 3345.9973 3969.1751 3345.1473 C 3969.1751 3344.1873 3968.6951 3343.5873 3968.0351 3343.5873 Z  M 3972.2351 3343.1073 C 3973.1651 3343.1073 3973.9851 3343.8373 3973.9851 3345.0873 C 3973.9851 3346.3473 3973.1651 3347.0773 3972.2351 3347.0773 C 3971.3151 3347.0773 3970.5051 3346.3473 3970.5051 3345.0873 C 3970.5051 3343.8373 3971.3151 3343.1073 3972.2351 3343.1073 Z  M 3972.2351 3343.5873 C 3971.5651 3343.5873 3971.0951 3344.1873 3971.0951 3345.0873 C 3971.0951 3345.9873 3971.5651 3346.5873 3972.2351 3346.5873 C 3972.9151 3346.5873 3973.3951 3345.9873 3973.3951 3345.0873 C 3973.3951 3344.1873 3972.9151 3343.5873 3972.2351 3343.5873 Z  M 3976.0351 3343.1073 C 3976.2451 3343.1073 3976.4951 3343.1773 3976.7051 3343.2473 L 3976.5951 3343.6773 C 3976.4651 3343.6273 3976.2951 3343.5773 3976.1551 3343.5773 C 3975.6951 3343.5773 3975.5551 3343.8573 3975.5551 3344.3173 L 3975.5551 3346.5073 L 3976.6051 3346.5073 L 3976.6051 3346.9773 L 3975.5551 3346.9773 L 3975.5551 3348.0473 L 3975.0851 3348.0473 L 3975.0151 3346.9773 L 3974.4151 3346.9373 L 3974.4151 3346.5073 L 3974.9951 3346.5073 L 3974.9951 3344.3373 C 3974.9951 3343.6073 3975.2451 3343.1073 3976.0351 3343.1073 Z  M 3978.6351 3343.1073 C 3979.0951 3343.1073 3979.5051 3343.3473 3979.8051 3343.6473 L 3979.8251 3343.6473 L 3979.8751 3343.1973 L 3980.3451 3343.1973 L 3980.3451 3348.7673 L 3979.7751 3348.7673 L 3979.7751 3347.2873 L 3979.8051 3346.6273 C 3979.4651 3346.9073 3979.1651 3347.0773 3978.7251 3347.0773 C 3977.8551 3347.0773 3977.0751 3346.3073 3977.0751 3345.0873 C 3977.0751 3343.8173 3977.6851 3343.1073 3978.6351 3343.1073 Z  M 3978.7551 3343.5873 C 3978.0651 3343.5873 3977.6751 3344.1573 3977.6751 3345.0873 C 3977.6751 3345.9673 3978.1651 3346.5873 3978.8151 3346.5873 C 3979.1451 3346.5873 3979.4351 3346.4773 3979.7751 3346.1673 L 3979.7751 3344.1273 C 3979.4451 3343.7673 3979.1251 3343.5873 3978.7551 3343.5873 Z  M 3983.1151 3343.1073 C 3984.0351 3343.1073 3984.8551 3343.8373 3984.8551 3345.0873 C 3984.8551 3346.3473 3984.0351 3347.0773 3983.1151 3347.0773 C 3982.1851 3347.0773 3981.3751 3346.3473 3981.3751 3345.0873 C 3981.3751 3343.8373 3982.1851 3343.1073 3983.1151 3343.1073 Z  M 3983.1151 3343.5873 C 3982.4351 3343.5873 3981.9651 3344.1873 3981.9651 3345.0873 C 3981.9651 3345.9873 3982.4351 3346.5873 3983.1151 3346.5873 C 3983.7851 3346.5873 3984.2651 3345.9873 3984.2651 3345.0873 C 3984.2651 3344.1873 3983.7851 3343.5873 3983.1151 3343.5873 Z  M 3986.4951 3343.1073 C 3986.6551 3343.1073 3986.7551 3343.1273 3986.8451 3343.1573 L 3986.7551 3343.5973 C 3986.6851 3343.5873 3986.6551 3343.5873 3986.6251 3343.5873 C 3986.5251 3343.5873 3986.4451 3343.6573 3986.4451 3343.8473 L 3986.4451 3348.7673 L 3985.8851 3348.7673 L 3985.8851 3343.8873 C 3985.8851 3343.3873 3986.0651 3343.1073 3986.4951 3343.1073 Z  M 3987.8451 3341.5473 C 3988.5751 3341.5473 3988.9651 3342.1273 3989.2251 3342.8473 L 3990.6651 3346.9773 L 3990.1051 3346.9773 L 3989.3951 3344.8173 C 3989.2951 3344.4873 3989.1751 3344.0973 3989.0751 3343.7473 L 3989.0351 3343.7473 C 3988.9151 3344.0973 3988.7851 3344.4873 3988.6651 3344.8173 L 3987.8551 3346.9773 L 3987.2651 3346.9773 L 3988.7851 3343.1773 L 3988.7051 3342.8773 C 3988.5351 3342.3973 3988.2551 3342.0273 3987.8251 3342.0273 C 3987.7151 3342.0273 3987.6051 3342.0573 3987.5251 3342.0873 L 3987.4051 3341.6273 C 3987.5251 3341.5773 3987.6751 3341.5473 3987.8451 3341.5473 Z ","useTrueTypeFontRendering":true,"thickness":0.8,"width":0.8,"net":""}]},"fabrication":{"F":[],"B":[]}},"footprints":[{"ref":"TPNL","center":[4064.685,3306.4331],"bbox":{"pos":[4064.685,3306.4331],"angle":180,"relpos":[-30.708749999999327,-14.073299999999563],"size":[61.41749999999956,21.65045000000009]},"pads":[{"layers":["B"],"pos":[4083.377,3301.415],"size":[1.1811,5.1181],"angle":0,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4083.3769,"y":3301.415},"polygon":[{"x":4083.9674,"y":3298.856},{"x":4082.7863,"y":3298.856},{"x":4082.7863,"y":3303.9741},{"x":4083.9674,"y":3303.9741}],"net":"+3.3V"},{"layers":["B"],"pos":[4081.409,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4081.4088,"y":3301.4151},"polygon":[{"x":4081.9993,"y":3298.856},{"x":4080.8183,"y":3298.856},{"x":4080.8183,"y":3303.9741},{"x":4081.9993,"y":3303.9741}],"net":"+3.3V"},{"layers":["B"],"pos":[4079.44,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4079.4399,"y":3301.4151},"polygon":[{"x":4080.0303,"y":3298.856},{"x":4078.8493,"y":3298.856},{"x":4078.8493,"y":3303.9741},{"x":4080.0303,"y":3303.9741}],"net":"+5V"},{"layers":["B"],"pos":[4077.472,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4077.4718,"y":3301.4151},"polygon":[{"x":4078.0624,"y":3298.856},{"x":4076.8813,"y":3298.856},{"x":4076.8813,"y":3303.9741},{"x":4078.0624,"y":3303.9741}],"net":"+5V"},{"layers":["B"],"pos":[4075.503,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4075.5029,"y":3301.4151},"polygon":[{"x":4076.0934,"y":3298.856},{"x":4074.9123,"y":3298.856},{"x":4074.9123,"y":3303.9741},{"x":4076.0934,"y":3303.9741}],"net":"GND"},{"layers":["B"],"pos":[4073.535,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4073.5348,"y":3301.4151},"polygon":[{"x":4074.1254,"y":3298.856},{"x":4072.9442,"y":3298.856},{"x":4072.9442,"y":3303.9741},{"x":4074.1254,"y":3303.9741}],"net":"USB_N"},{"layers":["B"],"pos":[4071.566,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4071.5659,"y":3301.4151},"polygon":[{"x":4072.1564,"y":3298.856},{"x":4070.9752,"y":3298.856},{"x":4070.9752,"y":3303.9741},{"x":4072.1564,"y":3303.9741}],"net":"USB_P"},{"layers":["B"],"pos":[4069.598,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4069.5978,"y":3301.4151},"polygon":[{"x":4070.1884,"y":3298.856},{"x":4069.0073,"y":3298.856},{"x":4069.0073,"y":3303.9741},{"x":4070.1884,"y":3303.9741}],"net":"GND"},{"layers":["B"],"pos":[4067.629,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4067.6289,"y":3301.4151},"polygon":[{"x":4068.2194,"y":3298.856},{"x":4067.0382,"y":3298.856},{"x":4067.0382,"y":3303.9741},{"x":4068.2194,"y":3303.9741}],"net":"SCL"},{"layers":["B"],"pos":[4065.661,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4065.6608,"y":3301.4151},"polygon":[{"x":4066.2513,"y":3298.856},{"x":4065.0703,"y":3298.856},{"x":4065.0703,"y":3303.9741},{"x":4066.2513,"y":3303.9741}],"net":"SDA"},{"layers":["B"],"pos":[4063.692,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4063.6919,"y":3301.4151},"polygon":[{"x":4064.2823,"y":3298.856},{"x":4063.1013,"y":3298.856},{"x":4063.1013,"y":3303.9741},{"x":4064.2823,"y":3303.9741}],"net":"TX0"},{"layers":["B"],"pos":[4061.724,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4061.7238,"y":3301.4151},"polygon":[{"x":4062.3144,"y":3298.856},{"x":4061.1333,"y":3298.856},{"x":4061.1333,"y":3303.9741},{"x":4062.3144,"y":3303.9741}],"net":"RX0"},{"layers":["B"],"pos":[4059.755,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4059.7549,"y":3301.4151},"polygon":[{"x":4060.3453,"y":3298.856},{"x":4059.1643,"y":3298.856},{"x":4059.1643,"y":3303.9741},{"x":4060.3453,"y":3303.9741}],"net":"PWM1"},{"layers":["B"],"pos":[4057.787,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4057.7868,"y":3301.4151},"polygon":[{"x":4058.3774,"y":3298.856},{"x":4057.1962,"y":3298.856},{"x":4057.1962,"y":3303.9741},{"x":4058.3774,"y":3303.9741}],"net":"PWM0"},{"layers":["B"],"pos":[4055.818,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4055.8178,"y":3301.4151},"polygon":[{"x":4056.4084,"y":3298.856},{"x":4055.2273,"y":3298.856},{"x":4055.2273,"y":3303.9741},{"x":4056.4084,"y":3303.9741}],"net":"GPIO0"},{"layers":["B"],"pos":[4053.85,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4053.8498,"y":3301.4151},"polygon":[{"x":4054.4404,"y":3298.856},{"x":4053.2592,"y":3298.856},{"x":4053.2592,"y":3303.9741},{"x":4054.4404,"y":3303.9741}],"net":"GPIO1"},{"layers":["B"],"pos":[4051.881,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4051.8808,"y":3301.4151},"polygon":[{"x":4052.4714,"y":3298.856},{"x":4051.2902,"y":3298.856},{"x":4051.2902,"y":3303.9741},{"x":4052.4714,"y":3303.9741}],"net":"GPIO2"},{"layers":["B"],"pos":[4049.905,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4049.9049,"y":3301.415},"polygon":[{"x":4050.4954,"y":3298.8559},{"x":4049.3143,"y":3298.8559},{"x":4049.3143,"y":3303.974},{"x":4050.4954,"y":3303.974}],"net":"GPIO3"},{"layers":["B"],"pos":[4047.944,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4047.9439,"y":3301.4151},"polygon":[{"x":4048.5344,"y":3298.856},{"x":4047.3533,"y":3298.856},{"x":4047.3533,"y":3303.9741},{"x":4048.5344,"y":3303.9741}],"net":"GPIO4"},{"layers":["B"],"pos":[4045.976,3301.415],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4045.9759,"y":3301.415},"polygon":[{"x":4046.5663,"y":3298.8559},{"x":4045.3853,"y":3298.8559},{"x":4045.3853,"y":3303.974},{"x":4046.5663,"y":3303.974}],"net":"GPIO5"},{"layers":["B"],"pos":[4036.929,3311.451],"size":[5.9055,7.874],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4036.9288,"y":3311.4519},"polygon":[{"x":4039.8837,"y":3307.5114},{"x":4033.9737,"y":3307.5114},{"x":4033.9737,"y":3315.3914},{"x":4039.8837,"y":3315.3914}],"net":""},{"layers":["B"],"pos":[4092.441,3311.451],"size":[5.9055,7.874],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4092.4409,"y":3311.4519},"polygon":[{"x":4095.3963,"y":3307.5114},{"x":4089.4862,"y":3307.5114},{"x":4089.4862,"y":3315.3914},{"x":4095.3963,"y":3315.3914}],"net":""}],"drawings":[],"layer":"B"},{"ref":"QWIIC","center":[4050.7086,3321],"bbox":{"pos":[4050.7086,3321],"angle":270,"relpos":[-13.091299999999592,-6.996400000000904],"size":[26.18159999999989,14.75230000000056]},"pads":[{"layers":["F"],"pos":[4054.694,3326.905],"size":[1.5748,6.2992],"angle":-270,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4054.6941,"y":3326.9046},"polygon":[{"x":4057.8437,"y":3326.1172},{"x":4057.8437,"y":3327.692},{"x":4051.5445,"y":3327.692},{"x":4051.5445,"y":3326.1172}],"net":"GND"},{"layers":["F"],"pos":[4054.694,3322.968],"size":[1.5748,6.2992],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4054.6941,"y":3322.9676},"polygon":[{"x":4057.8437,"y":3322.1802},{"x":4057.8437,"y":3323.755},{"x":4051.5445,"y":3323.755},{"x":4051.5445,"y":3322.1802}],"net":"+3.3V"},{"layers":["F"],"pos":[4054.694,3319.031],"size":[1.5748,6.2992],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4054.6941,"y":3319.0306},"polygon":[{"x":4057.8437,"y":3318.2432},{"x":4057.8437,"y":3319.818},{"x":4051.5445,"y":3319.818},{"x":4051.5445,"y":3318.2432}],"net":"SDA"},{"layers":["F"],"pos":[4054.694,3315.094],"size":[1.5748,6.2992],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4054.6941,"y":3315.0936},"polygon":[{"x":4057.8437,"y":3314.3062},{"x":4057.8437,"y":3315.881},{"x":4051.5445,"y":3315.881},{"x":4051.5445,"y":3314.3062}],"net":"SCL"},{"layers":["F"],"pos":[4046.724,3330.547],"size":[4.5276,7.0866],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4046.7235,"y":3330.5466},"polygon":[{"x":4050.2669,"y":3328.2829},{"x":4050.2669,"y":3332.8105},{"x":4043.1803,"y":3332.8105},{"x":4043.1803,"y":3328.2829}],"net":""},{"layers":["F"],"pos":[4046.724,3311.452],"size":[4.5276,7.0866],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4046.7235,"y":3311.4521},"polygon":[{"x":4050.2669,"y":3309.1884},{"x":4050.2669,"y":3313.716},{"x":4043.1803,"y":3313.716},{"x":4043.1803,"y":3309.1884}],"net":""}],"drawings":[],"layer":"F"},{"ref":"UART","center":[4077.4802,3321],"bbox":{"pos":[4077.4802,3321],"angle":270,"relpos":[-11.613749999999982,-7.393800000000283],"size":[23.227499999999964,15.500299999999697]},"pads":[{"layers":["F"],"pos":[4083.386,3317.063],"size":[1.9685,4.7244],"angle":-270,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4083.3855,"y":3317.063},"polygon":[{"x":4085.7477,"y":3316.0787},{"x":4085.7477,"y":3318.0473},{"x":4081.0233,"y":3318.0473},{"x":4081.0233,"y":3316.0787}],"net":"GND"},{"layers":["F"],"pos":[4083.386,3321],"size":[1.9685,4.7244],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4083.3855,"y":3321},"polygon":[{"x":4085.7477,"y":3320.0157},{"x":4085.7477,"y":3321.9843},{"x":4081.0233,"y":3321.9843},{"x":4081.0233,"y":3320.0157}],"net":"RX0"},{"layers":["F"],"pos":[4083.386,3324.937],"size":[1.9685,4.7244],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4083.3855,"y":3324.937},"polygon":[{"x":4085.7477,"y":3323.9527},{"x":4085.7477,"y":3325.9213},{"x":4081.0233,"y":3325.9213},{"x":4081.0233,"y":3323.9527}],"net":"TX0"},{"layers":["F"],"pos":[4071.575,3329.661],"size":[3.1496,5.9055],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4071.5746,"y":3329.6615},"polygon":[{"x":4074.5276,"y":3328.0862},{"x":4074.5276,"y":3331.2358},{"x":4068.6221,"y":3331.2358},{"x":4068.6221,"y":3328.0862}],"net":""},{"layers":["F"],"pos":[4071.575,3312.339],"size":[3.1496,5.9055],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4071.5746,"y":3312.3387},"polygon":[{"x":4074.5276,"y":3310.7642},{"x":4074.5276,"y":3313.9138},{"x":4068.6221,"y":3313.9138},{"x":4068.6221,"y":3310.7642}],"net":""}],"drawings":[],"layer":"F"},{"ref":"GPIO","center":[3955.0395,3321],"bbox":{"pos":[3955.0395,3321],"angle":0,"relpos":[-30.905499999999847,-10],"size":[61.81100000000015,20]},"pads":[{"layers":["F","B"],"pos":[3930.04,3326],"size":[6.6929,6.6929],"angle":0,"pin1":1,"shape":"rect","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3930.0395,"y":3326},"polygon":[{"x":3926.6935,"y":3322.654},{"x":3933.3855,"y":3322.654},{"x":3933.3855,"y":3329.346},{"x":3926.6935,"y":3329.346}],"net":"+3.3V"},{"layers":["F","B"],"pos":[3930.04,3316],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3930.0395,"y":3316},"polygon":[],"net":"+5V"},{"layers":["F","B"],"pos":[3940.04,3326],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3940.0395,"y":3326},"polygon":[],"net":"+3.3V"},{"layers":["F","B"],"pos":[3940.04,3316],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3940.0395,"y":3316},"polygon":[],"net":"+5V"},{"layers":["F","B"],"pos":[3950.04,3326],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3950.0395,"y":3326},"polygon":[],"net":"GPIO0"},{"layers":["F","B"],"pos":[3950.04,3316],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3950.0395,"y":3316},"polygon":[],"net":"GPIO1"},{"layers":["F","B"],"pos":[3960.04,3326],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3960.0395,"y":3326},"polygon":[],"net":"GPIO2"},{"layers":["F","B"],"pos":[3960.04,3316],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3960.0395,"y":3316},"polygon":[],"net":"GPIO3"},{"layers":["F","B"],"pos":[3970.04,3326],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3970.0395,"y":3326},"polygon":[],"net":"GPIO4"},{"layers":["F","B"],"pos":[3970.04,3316],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3970.0395,"y":3316},"polygon":[],"net":"GPIO5"},{"layers":["F","B"],"pos":[3980.04,3326],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3980.0395,"y":3326},"polygon":[],"net":"GND"},{"layers":["F","B"],"pos":[3980.04,3316],"size":[6.6929,6.6929],"angle":0,"shape":"oval","type":"th","drillsize":[4.3308,4.3308],"holeCenterPoint":{"x":3980.0395,"y":3316},"polygon":[],"net":"GND"}],"drawings":[],"layer":"F"},{"ref":"USB","center":[4111.1416,3321],"bbox":{"pos":[4111.1416,3321],"angle":270,"relpos":[-31.57465000000002,-13.149550000001],"size":[63.1503000000007,29.07865000000129]},"pads":[{"layers":["F","B"],"pos":[4101.733,3307.221],"size":[5.1181,5.1181],"angle":-270,"pin1":1,"shape":"oval","type":"th","drillsize":[3.5434,3.5434],"holeCenterPoint":{"x":4101.7322,"y":3307.2205},"polygon":[],"net":"+5V"},{"layers":["F","B"],"pos":[4101.733,3317.064],"size":[5.1181,5.1181],"angle":-270,"shape":"oval","type":"th","drillsize":[3.5434,3.5434],"holeCenterPoint":{"x":4101.7322,"y":3317.063},"polygon":[],"net":"USB_N"},{"layers":["F","B"],"pos":[4101.733,3324.938],"size":[5.1181,5.1181],"angle":-270,"shape":"oval","type":"th","drillsize":[3.5434,3.5434],"holeCenterPoint":{"x":4101.7322,"y":3324.937},"polygon":[],"net":"USB_P"},{"layers":["F","B"],"pos":[4101.733,3334.78],"size":[5.1181,5.1181],"angle":-90,"shape":"oval","type":"th","drillsize":[3.5434,3.5434],"holeCenterPoint":{"x":4101.7322,"y":3334.7795},"polygon":[],"net":"GND"},{"layers":["F","B"],"pos":[4104.095,3346.867],"size":[7.4803,11.4173],"angle":-270,"shape":"oval","type":"th","drillsize":[5.1182,9.0552],"drillshape":"oblong","holeCenterPoint":{"x":4104.0944,"y":3346.8661},"polygon":[{"x":4102.1265,"y":3350.6072},{"x":4101.9401,"y":3350.6026},{"x":4101.7541,"y":3350.5886},{"x":4101.5691,"y":3350.5654},{"x":4101.3854,"y":3350.533},{"x":4101.2036,"y":3350.4915},{"x":4101.0241,"y":3350.441},{"x":4100.8473,"y":3350.3816},{"x":4100.6737,"y":3350.3135},{"x":4100.5037,"y":3350.2368},{"x":4100.3377,"y":3350.1517},{"x":4100.1762,"y":3350.0585},{"x":4100.0196,"y":3349.9573},{"x":4099.8682,"y":3349.8484},{"x":4099.7223,"y":3349.7322},{"x":4099.5825,"y":3349.6088},{"x":4099.449,"y":3349.4785},{"x":4099.3222,"y":3349.3418},{"x":4099.2023,"y":3349.199},{"x":4099.0897,"y":3349.0503},{"x":4098.9846,"y":3348.8962},{"x":4098.8874,"y":3348.7371},{"x":4098.7982,"y":3348.5733},{"x":4098.7173,"y":3348.4053},{"x":4098.6448,"y":3348.2334},{"x":4098.5811,"y":3348.0582},{"x":4098.5261,"y":3347.88},{"x":4098.4801,"y":3347.6993},{"x":4098.4431,"y":3347.5165},{"x":4098.4153,"y":3347.3321},{"x":4098.3968,"y":3347.1465},{"x":4098.3875,"y":3346.9602},{"x":4098.3875,"y":3346.7738},{"x":4098.3968,"y":3346.5875},{"x":4098.4153,"y":3346.4019},{"x":4098.4431,"y":3346.2175},{"x":4098.4801,"y":3346.0347},{"x":4098.5261,"y":3345.854},{"x":4098.5811,"y":3345.6758},{"x":4098.6448,"y":3345.5006},{"x":4098.7173,"y":3345.3287},{"x":4098.7982,"y":3345.1607},{"x":4098.8874,"y":3344.9969},{"x":4098.9846,"y":3344.8378},{"x":4099.0897,"y":3344.6837},{"x":4099.2023,"y":3344.535},{"x":4099.3222,"y":3344.3922},{"x":4099.449,"y":3344.2555},{"x":4099.5825,"y":3344.1252},{"x":4099.7223,"y":3344.0018},{"x":4099.8682,"y":3343.8856},{"x":4100.0196,"y":3343.7767},{"x":4100.1762,"y":3343.6755},{"x":4100.3377,"y":3343.5823},{"x":4100.5037,"y":3343.4972},{"x":4100.6737,"y":3343.4205},{"x":4100.8473,"y":3343.3524},{"x":4101.0241,"y":3343.293},{"x":4101.2036,"y":3343.2425},{"x":4101.3854,"y":3343.201},{"x":4101.5691,"y":3343.1686},{"x":4101.7541,"y":3343.1454},{"x":4101.9401,"y":3343.1314},{"x":4102.1265,"y":3343.1268},{"x":4106.0635,"y":3343.1268},{"x":4106.2499,"y":3343.1314},{"x":4106.4359,"y":3343.1454},{"x":4106.6209,"y":3343.1686},{"x":4106.8046,"y":3343.201},{"x":4106.9864,"y":3343.2425},{"x":4107.1659,"y":3343.293},{"x":4107.3427,"y":3343.3524},{"x":4107.5163,"y":3343.4205},{"x":4107.6863,"y":3343.4972},{"x":4107.8523,"y":3343.5823},{"x":4108.0138,"y":3343.6755},{"x":4108.1704,"y":3343.7767},{"x":4108.3218,"y":3343.8856},{"x":4108.4677,"y":3344.0018},{"x":4108.6075,"y":3344.1252},{"x":4108.741,"y":3344.2555},{"x":4108.8678,"y":3344.3922},{"x":4108.9877,"y":3344.535},{"x":4109.1003,"y":3344.6837},{"x":4109.2054,"y":3344.8378},{"x":4109.3026,"y":3344.9969},{"x":4109.3918,"y":3345.1607},{"x":4109.4727,"y":3345.3287},{"x":4109.5452,"y":3345.5006},{"x":4109.6089,"y":3345.6758},{"x":4109.6639,"y":3345.854},{"x":4109.7099,"y":3346.0347},{"x":4109.7469,"y":3346.2175},{"x":4109.7747,"y":3346.4019},{"x":4109.7932,"y":3346.5875},{"x":4109.8025,"y":3346.7738},{"x":4109.8025,"y":3346.9602},{"x":4109.7932,"y":3347.1465},{"x":4109.7747,"y":3347.3321},{"x":4109.7469,"y":3347.5165},{"x":4109.7099,"y":3347.6993},{"x":4109.6639,"y":3347.88},{"x":4109.6089,"y":3348.0582},{"x":4109.5452,"y":3348.2334},{"x":4109.4727,"y":3348.4053},{"x":4109.3918,"y":3348.5733},{"x":4109.3026,"y":3348.7371},{"x":4109.2054,"y":3348.8962},{"x":4109.1003,"y":3349.0503},{"x":4108.9877,"y":3349.199},{"x":4108.8678,"y":3349.3418},{"x":4108.741,"y":3349.4785},{"x":4108.6075,"y":3349.6088},{"x":4108.4677,"y":3349.7322},{"x":4108.3218,"y":3349.8484},{"x":4108.1704,"y":3349.9573},{"x":4108.0138,"y":3350.0585},{"x":4107.8523,"y":3350.1517},{"x":4107.6863,"y":3350.2368},{"x":4107.5163,"y":3350.3135},{"x":4107.3427,"y":3350.3816},{"x":4107.1659,"y":3350.441},{"x":4106.9864,"y":3350.4915},{"x":4106.8046,"y":3350.533},{"x":4106.6209,"y":3350.5654},{"x":4106.4359,"y":3350.5886},{"x":4106.2499,"y":3350.6026},{"x":4106.0635,"y":3350.6072}],"net":"GND"},{"layers":["F","B"],"pos":[4104.095,3295.134],"size":[7.4803,11.4173],"angle":-270,"shape":"oval","type":"th","drillsize":[5.1182,9.0551],"drillshape":"oblong","holeCenterPoint":{"x":4104.094349999999,"y":3295.1339},"polygon":[{"x":4102.1265,"y":3298.8742},{"x":4101.9401,"y":3298.8696},{"x":4101.7541,"y":3298.8556},{"x":4101.5691,"y":3298.8324},{"x":4101.3854,"y":3298.8},{"x":4101.2036,"y":3298.7585},{"x":4101.0241,"y":3298.708},{"x":4100.8473,"y":3298.6486},{"x":4100.6737,"y":3298.5805},{"x":4100.5037,"y":3298.5038},{"x":4100.3377,"y":3298.4187},{"x":4100.1762,"y":3298.3255},{"x":4100.0196,"y":3298.2243},{"x":4099.8682,"y":3298.1154},{"x":4099.7223,"y":3297.9992},{"x":4099.5825,"y":3297.8758},{"x":4099.449,"y":3297.7455},{"x":4099.3222,"y":3297.6088},{"x":4099.2023,"y":3297.466},{"x":4099.0897,"y":3297.3173},{"x":4098.9846,"y":3297.1632},{"x":4098.8874,"y":3297.0041},{"x":4098.7982,"y":3296.8403},{"x":4098.7173,"y":3296.6723},{"x":4098.6448,"y":3296.5004},{"x":4098.5811,"y":3296.3252},{"x":4098.5261,"y":3296.147},{"x":4098.4801,"y":3295.9663},{"x":4098.4431,"y":3295.7835},{"x":4098.4153,"y":3295.5991},{"x":4098.3968,"y":3295.4135},{"x":4098.3875,"y":3295.2272},{"x":4098.3875,"y":3295.0408},{"x":4098.3968,"y":3294.8545},{"x":4098.4153,"y":3294.6689},{"x":4098.4431,"y":3294.4845},{"x":4098.4801,"y":3294.3017},{"x":4098.5261,"y":3294.121},{"x":4098.5811,"y":3293.9428},{"x":4098.6448,"y":3293.7676},{"x":4098.7173,"y":3293.5957},{"x":4098.7982,"y":3293.4277},{"x":4098.8874,"y":3293.2639},{"x":4098.9846,"y":3293.1048},{"x":4099.0897,"y":3292.9507},{"x":4099.2023,"y":3292.802},{"x":4099.3222,"y":3292.6592},{"x":4099.449,"y":3292.5225},{"x":4099.5825,"y":3292.3922},{"x":4099.7223,"y":3292.2688},{"x":4099.8682,"y":3292.1526},{"x":4100.0196,"y":3292.0437},{"x":4100.1762,"y":3291.9425},{"x":4100.3377,"y":3291.8493},{"x":4100.5037,"y":3291.7642},{"x":4100.6737,"y":3291.6875},{"x":4100.8473,"y":3291.6194},{"x":4101.0241,"y":3291.56},{"x":4101.2036,"y":3291.5095},{"x":4101.3854,"y":3291.468},{"x":4101.5691,"y":3291.4356},{"x":4101.7541,"y":3291.4124},{"x":4101.9401,"y":3291.3984},{"x":4102.1265,"y":3291.3938},{"x":4106.0635,"y":3291.3938},{"x":4106.2499,"y":3291.3984},{"x":4106.4359,"y":3291.4124},{"x":4106.6209,"y":3291.4356},{"x":4106.8046,"y":3291.468},{"x":4106.9864,"y":3291.5095},{"x":4107.1659,"y":3291.56},{"x":4107.3427,"y":3291.6194},{"x":4107.5163,"y":3291.6875},{"x":4107.6863,"y":3291.7642},{"x":4107.8523,"y":3291.8493},{"x":4108.0138,"y":3291.9425},{"x":4108.1704,"y":3292.0437},{"x":4108.3218,"y":3292.1526},{"x":4108.4677,"y":3292.2688},{"x":4108.6075,"y":3292.3922},{"x":4108.741,"y":3292.5225},{"x":4108.8678,"y":3292.6592},{"x":4108.9877,"y":3292.802},{"x":4109.1003,"y":3292.9507},{"x":4109.2054,"y":3293.1048},{"x":4109.3026,"y":3293.2639},{"x":4109.3918,"y":3293.4277},{"x":4109.4727,"y":3293.5957},{"x":4109.5452,"y":3293.7676},{"x":4109.6089,"y":3293.9428},{"x":4109.6639,"y":3294.121},{"x":4109.7099,"y":3294.3017},{"x":4109.7469,"y":3294.4845},{"x":4109.7747,"y":3294.6689},{"x":4109.7932,"y":3294.8545},{"x":4109.8025,"y":3295.0408},{"x":4109.8025,"y":3295.2272},{"x":4109.7932,"y":3295.4135},{"x":4109.7747,"y":3295.5991},{"x":4109.7469,"y":3295.7835},{"x":4109.7099,"y":3295.9663},{"x":4109.6639,"y":3296.147},{"x":4109.6089,"y":3296.3252},{"x":4109.5452,"y":3296.5004},{"x":4109.4727,"y":3296.6723},{"x":4109.3918,"y":3296.8403},{"x":4109.3026,"y":3297.0041},{"x":4109.2054,"y":3297.1632},{"x":4109.1003,"y":3297.3173},{"x":4108.9877,"y":3297.466},{"x":4108.8678,"y":3297.6088},{"x":4108.741,"y":3297.7455},{"x":4108.6075,"y":3297.8758},{"x":4108.4677,"y":3297.9992},{"x":4108.3218,"y":3298.1154},{"x":4108.1704,"y":3298.2243},{"x":4108.0138,"y":3298.3255},{"x":4107.8523,"y":3298.4187},{"x":4107.6863,"y":3298.5038},{"x":4107.5163,"y":3298.5805},{"x":4107.3427,"y":3298.6486},{"x":4107.1659,"y":3298.708},{"x":4106.9864,"y":3298.7585},{"x":4106.8046,"y":3298.8},{"x":4106.6209,"y":3298.8324},{"x":4106.4359,"y":3298.8556},{"x":4106.2499,"y":3298.8696},{"x":4106.0635,"y":3298.8742}],"net":"GND"},{"layers":["F","B"],"pos":[4120.551,3321.001],"size":[7.4803,11.4173],"angle":-180,"shape":"oval","type":"th","drillsize":[5.1182,9.0552],"drillshape":"oblong","holeCenterPoint":{"x":4120.5511,"y":3321},"polygon":[{"x":4120.4578,"y":3326.7085},{"x":4120.2715,"y":3326.6992},{"x":4120.0859,"y":3326.6807},{"x":4119.9015,"y":3326.6529},{"x":4119.7187,"y":3326.6159},{"x":4119.538,"y":3326.5699},{"x":4119.3598,"y":3326.5149},{"x":4119.1846,"y":3326.4512},{"x":4119.0127,"y":3326.3787},{"x":4118.8447,"y":3326.2978},{"x":4118.6809,"y":3326.2086},{"x":4118.5218,"y":3326.1114},{"x":4118.3677,"y":3326.0063},{"x":4118.219,"y":3325.8937},{"x":4118.0762,"y":3325.7738},{"x":4117.9395,"y":3325.647},{"x":4117.8092,"y":3325.5135},{"x":4117.6858,"y":3325.3737},{"x":4117.5696,"y":3325.2278},{"x":4117.4607,"y":3325.0764},{"x":4117.3595,"y":3324.9198},{"x":4117.2663,"y":3324.7583},{"x":4117.1812,"y":3324.5923},{"x":4117.1045,"y":3324.4223},{"x":4117.0364,"y":3324.2487},{"x":4116.977,"y":3324.0719},{"x":4116.9265,"y":3323.8924},{"x":4116.885,"y":3323.7106},{"x":4116.8526,"y":3323.5269},{"x":4116.8294,"y":3323.3419},{"x":4116.8154,"y":3323.1559},{"x":4116.8108,"y":3322.9695},{"x":4116.8108,"y":3319.0325},{"x":4116.8154,"y":3318.8461},{"x":4116.8294,"y":3318.6601},{"x":4116.8526,"y":3318.4751},{"x":4116.885,"y":3318.2914},{"x":4116.9265,"y":3318.1096},{"x":4116.977,"y":3317.9301},{"x":4117.0364,"y":3317.7533},{"x":4117.1045,"y":3317.5797},{"x":4117.1812,"y":3317.4097},{"x":4117.2663,"y":3317.2437},{"x":4117.3595,"y":3317.0822},{"x":4117.4607,"y":3316.9256},{"x":4117.5696,"y":3316.7742},{"x":4117.6858,"y":3316.6283},{"x":4117.8092,"y":3316.4885},{"x":4117.9395,"y":3316.355},{"x":4118.0762,"y":3316.2282},{"x":4118.219,"y":3316.1083},{"x":4118.3677,"y":3315.9957},{"x":4118.5218,"y":3315.8906},{"x":4118.6809,"y":3315.7934},{"x":4118.8447,"y":3315.7042},{"x":4119.0127,"y":3315.6233},{"x":4119.1846,"y":3315.5508},{"x":4119.3598,"y":3315.4871},{"x":4119.538,"y":3315.4321},{"x":4119.7187,"y":3315.3861},{"x":4119.9015,"y":3315.3491},{"x":4120.0859,"y":3315.3213},{"x":4120.2715,"y":3315.3028},{"x":4120.4578,"y":3315.2935},{"x":4120.6442,"y":3315.2935},{"x":4120.8305,"y":3315.3028},{"x":4121.0161,"y":3315.3213},{"x":4121.2005,"y":3315.3491},{"x":4121.3833,"y":3315.3861},{"x":4121.564,"y":3315.4321},{"x":4121.7422,"y":3315.4871},{"x":4121.9174,"y":3315.5508},{"x":4122.0893,"y":3315.6233},{"x":4122.2573,"y":3315.7042},{"x":4122.4211,"y":3315.7934},{"x":4122.5802,"y":3315.8906},{"x":4122.7343,"y":3315.9957},{"x":4122.883,"y":3316.1083},{"x":4123.0258,"y":3316.2282},{"x":4123.1625,"y":3316.355},{"x":4123.2928,"y":3316.4885},{"x":4123.4162,"y":3316.6283},{"x":4123.5324,"y":3316.7742},{"x":4123.6413,"y":3316.9256},{"x":4123.7425,"y":3317.0822},{"x":4123.8357,"y":3317.2437},{"x":4123.9208,"y":3317.4097},{"x":4123.9975,"y":3317.5797},{"x":4124.0656,"y":3317.7533},{"x":4124.125,"y":3317.9301},{"x":4124.1755,"y":3318.1096},{"x":4124.217,"y":3318.2914},{"x":4124.2494,"y":3318.4751},{"x":4124.2726,"y":3318.6601},{"x":4124.2866,"y":3318.8461},{"x":4124.2912,"y":3319.0325},{"x":4124.2912,"y":3322.9695},{"x":4124.2866,"y":3323.1559},{"x":4124.2726,"y":3323.3419},{"x":4124.2494,"y":3323.5269},{"x":4124.217,"y":3323.7106},{"x":4124.1755,"y":3323.8924},{"x":4124.125,"y":3324.0719},{"x":4124.0656,"y":3324.2487},{"x":4123.9975,"y":3324.4223},{"x":4123.9208,"y":3324.5923},{"x":4123.8357,"y":3324.7583},{"x":4123.7425,"y":3324.9198},{"x":4123.6413,"y":3325.0764},{"x":4123.5324,"y":3325.2278},{"x":4123.4162,"y":3325.3737},{"x":4123.2928,"y":3325.5135},{"x":4123.1625,"y":3325.647},{"x":4123.0258,"y":3325.7738},{"x":4122.883,"y":3325.8937},{"x":4122.7343,"y":3326.0063},{"x":4122.5802,"y":3326.1114},{"x":4122.4211,"y":3326.2086},{"x":4122.2573,"y":3326.2978},{"x":4122.0893,"y":3326.3787},{"x":4121.9174,"y":3326.4512},{"x":4121.7422,"y":3326.5149},{"x":4121.564,"y":3326.5699},{"x":4121.3833,"y":3326.6159},{"x":4121.2005,"y":3326.6529},{"x":4121.0161,"y":3326.6807},{"x":4120.8305,"y":3326.6992},{"x":4120.6442,"y":3326.7085}],"net":"GND"}],"drawings":[],"layer":"F"},{"ref":"SERVO","center":[4013.1103,3321],"bbox":{"pos":[4013.1103,3321],"angle":180,"relpos":[-14.999999999999545,-9.999999999999545],"size":[30,20]},"pads":[{"layers":["F","B"],"pos":[4003.11,3326],"size":[7.0866,7.0866],"angle":-180,"shape":"oval","type":"th","drillsize":[4.1338,4.1338],"holeCenterPoint":{"x":4003.1103,"y":3326},"polygon":[],"net":"PWM1"},{"layers":["F","B"],"pos":[4003.11,3316],"size":[7.0866,7.0866],"angle":-180,"shape":"oval","type":"th","drillsize":[4.1338,4.1338],"holeCenterPoint":{"x":4003.1103,"y":3316},"polygon":[],"net":"PWM0"},{"layers":["F","B"],"pos":[4013.11,3326],"size":[7.0866,7.0866],"angle":-180,"shape":"oval","type":"th","drillsize":[4.1338,4.1338],"holeCenterPoint":{"x":4013.1103,"y":3326},"polygon":[],"net":"+5V"},{"layers":["F","B"],"pos":[4013.11,3316],"size":[7.0866,7.0866],"angle":-180,"shape":"oval","type":"th","drillsize":[4.1338,4.1338],"holeCenterPoint":{"x":4013.1103,"y":3316},"polygon":[],"net":"+5V"},{"layers":["F","B"],"pos":[4023.11,3326],"size":[7.0866,7.0866],"angle":-180,"shape":"oval","type":"th","drillsize":[4.1338,4.1338],"holeCenterPoint":{"x":4023.1103,"y":3326},"polygon":[],"net":"GND"},{"layers":["F","B"],"pos":[4023.11,3316],"size":[7.0866,7.0866],"angle":-180,"pin1":1,"shape":"rect","type":"th","drillsize":[4.1338,4.1338],"holeCenterPoint":{"x":4023.1103,"y":3316},"polygon":[{"x":4026.6536,"y":3319.5433},{"x":4019.567,"y":3319.5433},{"x":4019.567,"y":3312.4567},{"x":4026.6536,"y":3312.4567}],"net":"GND"}],"drawings":[],"layer":"F"}],"metadata":{"title":"PCB_Doly_CE_Top","revision":"0","company":"Unknown Company","date":"2023-04-03"},"tracks":{"F":[{"type":"polyline","net":"RX0","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4068.425,3321.394 4082.9913,3321.394 4083.3853,3321"},{"type":"polyline","net":"SDA","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4064.8818,3320.6063 4063.3065,3319.031 4054.6946,3319.031"},{"type":"polyline","net":"SCL","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4060.945,3315.488 4060.551,3315.094 4054.6946,3315.094"},{"type":"polyline","net":"TX0","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4071.575,3324.543 4083.3853,3324.543 4083.3853,3324.937"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1.5748,"svgpath":"M3940.0395,3326 3930.0395,3326"},{"type":"polyline","net":"+5V","start":[0,0],"end":[0,0],"width":1.9685,"svgpath":"M4013.1103,3326 4013.1103,3316"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1.9685,"svgpath":"M4054.6946,3322.968 4042.7317,3322.968 4040.1123,3320.3486 4040.1123,3304.8486 4049.1119,3295.849 4082.612,3295.849"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1.9685,"svgpath":"M3940.04,3326 3949.39,3335.35 4031.61,3335.35 4043.99,3322.97 4054.69,3322.97"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":2.3622,"svgpath":"M4082.612,3295.849 4082.6121,3295.8491 4085.1121,3295.8491"},{"type":"polyline","net":"+5V","start":[0,0],"end":[0,0],"width":1.9685,"svgpath":"M4013.11,3316 4039.26,3289.85 4087.11,3289.85 4091.61,3294.35 4091.61,3300.85 4097.98,3307.22 4101.73,3307.22"},{"start":[4068.425,3321.394],"end":[4068.425,3321.394],"width":2.4,"net":"RX0"},{"start":[4071.575,3324.543],"end":[4071.575,3324.543],"width":2.4,"net":"TX0"},{"start":[4064.882,3320.606],"end":[4064.882,3320.606],"width":2.4,"net":"SDA"},{"start":[4060.945,3315.488],"end":[4060.945,3315.488],"width":2.4,"net":"SCL"},{"start":[4085.112,3295.849],"end":[4085.112,3295.849],"width":2.4,"net":"+3.3V"},{"start":[4082.612,3295.849],"end":[4082.612,3295.849],"width":2.4,"net":"+3.3V"}],"B":[{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4075.5,3301.42 4075.5,3306.03 4088.11,3318.64 4095.2,3318.64 4097.17,3316.67 4097.17,3314.7 4099.13,3312.73 4103.86,3312.73 4112.16,3321 4120.55,3321"},{"type":"polyline","net":"+5V","start":[0,0],"end":[0,0],"width":1.1811,"svgpath":"M4077.47,3301.42 4077.47,3305.24 4080.24,3308.01 4086.54,3308.01 4089.29,3305.25 4099.76,3305.25 4101.73,3307.22"},{"type":"polyline","net":"+5V","start":[0,0],"end":[0,0],"width":1.1811,"svgpath":"M4079.44,3301.42 4079.44,3304.46 4081.02,3306.04 4085.75,3306.04 4088.5,3303.28 4099.13,3303.28 4101.73,3305.88 4101.73,3307.22"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1.1811,"svgpath":"M4120.5515,3321.0005 4120.5515,3311.5905 4104.0945,3295.1335"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1.1811,"svgpath":"M4101.7325,3334.7795 4104.0945,3337.1415 4104.0945,3346.8665"},{"type":"polyline","net":"USB_N","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4101.73,3317.06 4101.73,3318.01 4098.74,3321 4087.72,3321 4073.53,3306.82 4073.53,3301.42"},{"type":"polyline","net":"USB_P","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4101.73,3324.94 4100.16,3323.36 4087.32,3323.36 4071.57,3307.61 4071.57,3301.42"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4069.6,3301.42 4069.6,3308.39 4086.54,3325.33 4095.59,3325.33 4101.73,3331.47 4101.73,3334.78"},{"type":"polyline","net":"RX0","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4061.72,3301.42 4061.72,3312.33 4068.43,3319.03 4068.43,3321.39"},{"type":"polyline","net":"TX0","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4063.69,3301.42 4063.69,3311.15 4071.57,3319.03 4071.57,3324.54"},{"type":"polyline","net":"SDA","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4065.66,3301.42 4065.66,3309.97 4074.72,3319.03 4074.72,3325.72 4073.15,3327.3 4069.21,3327.3 4064.88,3322.97 4064.88,3320.61"},{"type":"polyline","net":"SCL","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4067.63,3301.42 4067.63,3309.18 4076.69,3318.24 4076.69,3327.3 4074.33,3329.66 4068.43,3329.66 4060.95,3322.18 4060.95,3315.49"},{"type":"polyline","net":"PWM0","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4003.11,3316 4008.19,3321.08 4008.19,3329.27 4012.12,3333.2 4032.95,3333.2 4057.79,3308.36 4057.79,3301.42"},{"type":"polyline","net":"PWM1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4003.11,3326 4003.11,3327.34 4010.94,3335.17 4034.12,3335.17 4059.76,3309.54 4059.76,3301.42"},{"type":"polyline","net":"GPIO4","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4047.94,3301.42 4047.94,3298.16 4046.55,3296.76 4044.58,3296.76 4041.04,3300.31 3998.66,3300.31 3990.78,3308.18 3969.78,3308.18 3965.11,3312.85 3965.11,3320.84 3970.04,3325.76 3970.04,3326"},{"type":"polyline","net":"GPIO3","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3960.04,3316 3960.04,3314.92 3968.75,3306.21 3989.75,3306.21 3998.02,3297.94 4040.25,3297.94 4043.4,3294.79 4047.34,3294.79 4049.91,3297.36 4049.91,3301.42"},{"type":"polyline","net":"GPIO5","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4045.98,3301.42 4045.98,3302.67 3999.29,3302.67 3991.42,3310.54 3973.42,3310.54 3970.04,3313.92 3970.04,3316"},{"type":"polyline","net":"GPIO2","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3960.04,3326 3960.04,3329.28 3962.61,3331.85 3982.11,3331.85 3985.75,3328.21 3985.75,3319.21 3999.93,3305.03 4041.82,3305.03 4043.79,3307 4049.7,3307 4051.88,3304.82 4051.88,3301.42"},{"type":"polyline","net":"GPIO1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4053.85,3301.42 4053.85,3306 4041.61,3318.24 4034.17,3318.24 4031.98,3316.05 4031.98,3310.94 4028.44,3307.39 4000.57,3307.39 3987.86,3320.1 3987.86,3329.1 3982.61,3334.35 3960.61,3334.35 3955.11,3328.85 3955.11,3321.07 3950.04,3316"},{"type":"polyline","net":"GPIO0","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4055.82,3301.42 4055.82,3307.18 4042.78,3320.21 4032.99,3320.21 4029.62,3316.84 4029.62,3311.72 4027.65,3309.75 4001.21,3309.75 3990.11,3320.85 3990.11,3329.85 3983.11,3336.85 3959.11,3336.85 3950.04,3327.78 3950.04,3326"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1.1811,"svgpath":"M4085.112,3295.849 4083.377,3297.584 4083.377,3301.415"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1.1811,"svgpath":"M4081.4092,3301.415 4081.4092,3297.0518 4082.612,3295.849"},{"type":"polyline","net":"+5V","start":[0,0],"end":[0,0],"width":1.1811,"svgpath":"M4079.44,3301.42 4079.44,3298.18 4070.61,3289.35 3963.61,3289.35 3936.96,3316 3930.04,3316"},{"type":"polyline","net":"+5V","start":[0,0],"end":[0,0],"width":1.1811,"svgpath":"M4077.47,3301.42 4077.47,3297.21 4070.11,3289.85 3964.11,3289.85 3940.04,3313.92 3940.04,3316"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1.1811,"svgpath":"M4075.5031,3301.415 4075.5031,3298.2395 4074.1123,3296.8487 4070.6123,3296.8487 4069.598,3297.863 4069.598,3301.415"},{"start":[4068.425,3321.394],"end":[4068.425,3321.394],"width":2.4,"net":"RX0"},{"start":[4071.575,3324.543],"end":[4071.575,3324.543],"width":2.4,"net":"TX0"},{"start":[4064.882,3320.606],"end":[4064.882,3320.606],"width":2.4,"net":"SDA"},{"start":[4060.945,3315.488],"end":[4060.945,3315.488],"width":2.4,"net":"SCL"},{"start":[4085.112,3295.849],"end":[4085.112,3295.849],"width":2.4,"net":"+3.3V"},{"start":[4082.612,3295.849],"end":[4082.612,3295.849],"width":2.4,"net":"+3.3V"}]},"zones":{"F":[{"net":"GND","svgpath":"M 3891.389 3355.3224 L 3891.23593 3355.29195 3891.10616 3355.20524 3891.01945 3355.07547 3890.989 3354.9224 3890.989 3335.3215 3891.01945 3335.16843 3891.10616 3335.03866 3891.23593 3334.95195 3891.389 3334.9215 3899.80403 3334.9215 3900.83955 3334.8828 3900.92872 3334.87595 3901.906 3334.76313 3901.99457 3334.74945 3902.96034 3334.56215 3903.04761 3334.54173 3903.99621 3334.28105 3904.08166 3334.25401 3905.00752 3333.92148 3905.09065 3333.88797 3905.98834 3333.48554 3906.06866 3333.44578 3906.93291 3332.97581 3907.00995 3332.93001 3907.83569 3332.39527 3907.909 3332.34371 3908.69138 3331.74732 3908.76053 3331.6903 3909.49496 3331.03577 3909.55954 3330.97362 3910.24171 3330.2648 3910.30134 3330.19789 3910.92726 3329.43892 3910.98159 3329.36764 3911.54757 3328.56299 3911.59629 3328.48776 3912.09901 3327.64215 3912.14183 3327.56341 3912.57834 3326.68179 3912.61501 3326.60001 3912.98276 3325.68756 3913.01305 3325.60321 3913.30987 3324.66529 3913.33362 3324.57887 3913.55778 3323.62098 3913.57484 3323.533 3913.72501 3322.56076 3913.73529 3322.47172 3913.8106 3321.49084 3913.81403 3321.40128 3913.81403 3320.41752 3913.8106 3320.32796 3913.73529 3319.34708 3913.72501 3319.25804 3913.57484 3318.2858 3913.55778 3318.19782 3913.33362 3317.23993 3913.30987 3317.15351 3913.01305 3316.21559 3912.98276 3316.13124 3912.61501 3315.21879 3912.57834 3315.13701 3912.14183 3314.25539 3912.09901 3314.17665 3911.59629 3313.33104 3911.54757 3313.25581 3910.98159 3312.45116 3910.92726 3312.37988 3910.30134 3311.62091 3910.24171 3311.554 3909.55954 3310.84518 3909.49496 3310.78303 3908.76053 3310.1285 3908.69138 3310.07148 3907.909 3309.47509 3907.83569 3309.42353 3907.00995 3308.88879 3906.93291 3308.84299 3906.06866 3308.37302 3905.98834 3308.33326 3905.09065 3307.93083 3905.00752 3307.89732 3904.08166 3307.56479 3903.99621 3307.53775 3903.04761 3307.27707 3902.96034 3307.25665 3901.99457 3307.06935 3901.906 3307.05567 3900.92872 3306.94285 3900.83955 3306.936 3899.80403 3306.8973 3891.389 3306.8973 3891.23593 3306.86685 3891.10616 3306.78014 3891.01945 3306.65037 3890.989 3306.4973 3890.989 3286.8964 3891.01945 3286.74333 3891.10616 3286.61356 3891.23593 3286.52685 3891.389 3286.4964 4148.391 3286.4964 4148.54407 3286.52685 4148.67384 3286.61356 4148.76055 3286.74333 4148.791 3286.8964 4148.791 3306.4973 4148.76055 3306.65037 4148.67384 3306.78014 4148.54407 3306.86685 4148.391 3306.8973 4139.97597 3306.8973 4138.94045 3306.936 4138.85128 3306.94285 4137.874 3307.05567 4137.78543 3307.06935 4136.81966 3307.25665 4136.73239 3307.27707 4135.78379 3307.53775 4135.69834 3307.56479 4134.77248 3307.89732 4134.68935 3307.93083 4133.79166 3308.33326 4133.71134 3308.37302 4132.84709 3308.84299 4132.77005 3308.88879 4131.94431 3309.42353 4131.871 3309.47509 4131.08862 3310.07148 4131.01947 3310.1285 4130.28504 3310.78303 4130.22046 3310.84518 4129.53829 3311.554 4129.47866 3311.62091 4128.85274 3312.37988 4128.79841 3312.45116 4128.23243 3313.25581 4128.18371 3313.33104 4127.68099 3314.17665 4127.63817 3314.25539 4127.20166 3315.13701 4127.16499 3315.21879 4126.79724 3316.13124 4126.76695 3316.21559 4126.47013 3317.15351 4126.44638 3317.23993 4126.22222 3318.19782 4126.20516 3318.2858 4126.05499 3319.25804 4126.04471 3319.34708 4125.9694 3320.32796 4125.96597 3320.41752 4125.96597 3321.40128 4125.9694 3321.49084 4126.04426 3322.46586 4126.10683 3322.89643 4126.20516 3323.533 4126.22222 3323.62098 4126.44638 3324.57887 4126.47013 3324.66529 4126.76695 3325.60321 4126.79724 3325.68756 4127.16499 3326.60001 4127.20166 3326.68179 4127.63817 3327.56341 4127.68099 3327.64215 4128.18371 3328.48776 4128.23243 3328.56299 4128.79841 3329.36764 4128.85274 3329.43892 4129.47866 3330.19789 4129.53829 3330.2648 4130.22046 3330.97362 4130.28504 3331.03577 4131.01947 3331.6903 4131.08862 3331.74732 4131.871 3332.34371 4131.94431 3332.39527 4132.77005 3332.93001 4132.84709 3332.97581 4133.71134 3333.44578 4133.79166 3333.48554 4134.68935 3333.88797 4134.77248 3333.92148 4135.69834 3334.25401 4135.78379 3334.28105 4136.73239 3334.54173 4136.81966 3334.56215 4137.78543 3334.74945 4137.874 3334.76313 4138.85128 3334.87595 4138.94045 3334.8828 4139.97597 3334.9215 4148.391 3334.9215 4148.54407 3334.95195 4148.67384 3335.03866 4148.76055 3335.16843 4148.791 3335.3215 4148.791 3354.9224 4148.76055 3355.07547 4148.67384 3355.20524 4148.54407 3355.29195 4148.391 3355.3224 3891.389 3355.3224 Z M 4031.60127 3337.35425 L 4031.78465 3337.34624 4031.95797 3337.32343 4032.12864 3337.28559 4032.29536 3337.23302 4032.45687 3337.16612 4032.61193 3337.0854 4032.75937 3336.99147 4032.89806 3336.88505 4033.03339 3336.76105 4041.47736 3328.31708 4041.60713 3328.23037 4041.7602 3328.19992 4041.91327 3328.23037 4042.04304 3328.31708 4042.12975 3328.44685 4042.1602 3328.59992 4042.1602 3332.78794 4042.18824 3333.03681 4042.26349 3333.25186 4042.38471 3333.44478 4042.54582 3333.60589 4042.73874 3333.72711 4042.95379 3333.80236 4043.20266 3333.8304 4050.24434 3333.8304 4050.49321 3333.80236 4050.70826 3333.72711 4050.90118 3333.60589 4051.06229 3333.44478 4051.18351 3333.25186 4051.25876 3333.03681 4051.2868 3332.78794 4051.2868 3329.112 4051.31725 3328.95893 4051.40396 3328.82916 4051.53373 3328.74245 4051.6868 3328.712 4052.8693 3328.712 4052.8693 3327.5483 4051.11348 3327.5483 4051.00275 3327.53267 4050.90067 3327.48699 4050.70826 3327.36609 4050.49321 3327.29084 4050.24434 3327.2628 4043.49732 3327.2628 4043.34425 3327.23235 4043.21448 3327.14564 4043.12777 3327.01587 4043.09732 3326.8628 4043.12777 3326.70973 4043.21448 3326.57996 4044.70303 3325.09141 4044.8328 3325.0047 4044.98587 3324.97425 4050.34482 3324.97425 4050.51024 3325.01006 4050.64605 3325.11107 4050.72792 3325.25921 4050.7412 3325.42794 4050.68351 3325.58706 4050.62779 3325.67574 4050.55254 3325.89079 4050.5245 3326.13966 4050.5245 3326.2609 4052.8693 3326.2609 4052.8693 3325.37425 4052.89975 3325.22118 4052.98646 3325.09141 4053.11623 3325.0047 4053.2693 3324.97425 4054.67254 3324.97425 4055.03777 3324.9423 4055.37517 3324.85189 4055.46029 3324.8123 4055.62897 3324.775 4056.1189 3324.775 4056.27197 3324.80545 4056.40174 3324.89216 4056.48845 3325.02193 4056.5189 3325.175 4056.5189 3326.2609 4058.8637 3326.2609 4058.8637 3326.13966 4058.83566 3325.89079 4058.76041 3325.67574 4058.63919 3325.48282 4058.47808 3325.32171 4058.40341 3325.27479 4058.28742 3325.16389 4058.22435 3325.01634 4058.22435 3324.85586 4058.28742 3324.70831 4058.40341 3324.59741 4058.47808 3324.55049 4058.63919 3324.38938 4058.76041 3324.19646 4058.83566 3323.98141 4058.8637 3323.73254 4058.8637 3322.20266 4058.83566 3321.95379 4058.76041 3321.73874 4058.63919 3321.54582 4058.47808 3321.38471 4058.40341 3321.33779 4058.28742 3321.22689 4058.22435 3321.07934 4058.22435 3320.91886 4058.28742 3320.77131 4058.40341 3320.66041 4058.58204 3320.56663 4058.69277 3320.551 4062.29218 3320.551 4062.43716 3320.5782 4062.56242 3320.65609 4062.65093 3320.77408 4062.69066 3320.91614 4062.69723 3320.99123 4062.79732 3321.36476 4062.96075 3321.71524 4063.18255 3322.03201 4063.45599 3322.30545 4063.77276 3322.52725 4064.12324 3322.69068 4064.49677 3322.79077 4064.882 3322.82447 4065.26723 3322.79077 4065.64076 3322.69068 4065.99124 3322.52725 4066.16161 3322.44512 4066.31765 3322.44172 4066.46311 3322.49829 4066.57585 3322.60621 4066.72555 3322.82001 4066.99899 3323.09345 4067.31576 3323.31525 4067.66624 3323.47868 4068.03977 3323.57877 4068.425 3323.61247 4068.81023 3323.57877 4068.93302 3323.54587 4069.09913 3323.53716 4069.25441 3323.59677 4069.37202 3323.71438 4069.43163 3323.86966 4069.42292 3324.03576 4069.39023 3324.15777 4069.35653 3324.543 4069.39023 3324.92823 4069.49032 3325.30176 4069.65375 3325.65224 4069.87555 3325.96901 4070.14899 3326.24245 4070.28694 3326.33904 4070.40097 3326.46168 4070.4548 3326.62026 4070.439 3326.78698 4070.35632 3326.93262 4070.22127 3327.03164 4070.05751 3327.0667 4068.64431 3327.0667 4068.39544 3327.09474 4068.18039 3327.16999 4067.98747 3327.29121 4067.82636 3327.45232 4067.70514 3327.64524 4067.62989 3327.86029 4067.60185 3328.10916 4067.60185 3331.21384 4067.62989 3331.46271 4067.70514 3331.67776 4067.82636 3331.87068 4067.98747 3332.03179 4068.18039 3332.15301 4068.39544 3332.22826 4068.64431 3332.2563 4074.50489 3332.2563 4074.75376 3332.22826 4074.96881 3332.15301 4075.16173 3332.03179 4075.32284 3331.87068 4075.44406 3331.67776 4075.51931 3331.46271 4075.54735 3331.21384 4075.54735 3328.10916 4075.51931 3327.86029 4075.44406 3327.64524 4075.32284 3327.45232 4075.16173 3327.29121 4074.96881 3327.16999 4074.75376 3327.09474 4074.50489 3327.0667 4073.09249 3327.0667 4072.92873 3327.03164 4072.79368 3326.93262 4072.711 3326.78698 4072.6952 3326.62026 4072.74903 3326.46168 4072.86306 3326.33904 4073.00101 3326.24245 4073.0633 3326.18016 4073.19307 3326.09345 4073.34614 3326.063 4079.7179 3326.063 4079.87786 3326.09638 4080.01112 3326.19093 4080.10659 3326.36271 4080.22781 3326.55563 4080.38892 3326.71674 4080.58184 3326.83796 4080.79689 3326.91321 4081.04576 3326.94125 4085.72524 3326.94125 4085.97411 3326.91321 4086.18916 3326.83796 4086.38208 3326.71674 4086.54319 3326.55563 4086.66441 3326.36271 4086.73966 3326.14766 4086.7677 3325.89879 4086.7677 3323.97521 4086.73966 3323.72634 4086.66441 3323.51129 4086.54319 3323.31837 4086.47616 3323.25134 4086.38945 3323.12157 4086.35901 3322.9685 4086.38945 3322.81543 4086.47616 3322.68566 4086.54319 3322.61863 4086.66441 3322.42571 4086.73966 3322.21066 4086.7677 3321.96179 4086.7677 3320.03821 4086.73966 3319.78934 4086.66441 3319.57429 4086.54319 3319.38137 4086.47616 3319.31434 4086.38945 3319.18457 4086.35901 3319.0315 4086.38945 3318.87843 4086.47616 3318.74866 4086.54319 3318.68163 4086.66441 3318.48871 4086.73966 3318.27366 4086.7677 3318.02479 4086.7677 3317.80513 4084.8166 3317.80513 4084.8166 3318.59575 4084.78615 3318.74882 4084.69944 3318.87859 4084.56967 3318.9653 4084.4166 3318.99575 4082.3544 3318.99575 4082.20133 3318.9653 4082.07156 3318.87859 4081.98485 3318.74882 4081.9544 3318.59575 4081.9544 3317.80513 4080.0033 3317.80513 4080.0033 3318.02479 4080.03134 3318.27366 4080.10659 3318.48871 4080.22781 3318.68163 4080.29484 3318.74866 4080.38155 3318.87843 4080.41199 3319.0315 4080.38155 3319.18457 4080.29484 3319.31434 4080.22781 3319.38137 4080.01112 3319.74607 4079.87786 3319.84062 4079.7179 3319.874 4070.19614 3319.874 4070.04307 3319.84355 4069.9133 3319.75684 4069.85101 3319.69455 4069.53424 3319.47275 4069.18376 3319.30932 4068.81023 3319.20923 4068.425 3319.17553 4068.03977 3319.20923 4067.66624 3319.30932 4067.31576 3319.47275 4067.14539 3319.55488 4066.98935 3319.55828 4066.84389 3319.50171 4066.73115 3319.39379 4066.58145 3319.17999 4066.30801 3318.90655 4065.99124 3318.68475 4065.64076 3318.52132 4065.26723 3318.42123 4064.95102 3318.39357 4064.81683 3318.35761 4064.70304 3318.27793 4064.3952 3317.97009 4064.14989 3317.76878 4063.88744 3317.62849 4063.60266 3317.5421 4063.28685 3317.511 4062.99482 3317.511 4062.82577 3317.47352 4062.6884 3317.36812 4062.60845 3317.21453 4062.6009 3317.04154 4062.66716 3316.88157 4062.86625 3316.59724 4063.02968 3316.24676 4063.12977 3315.87323 4063.16347 3315.488 4063.12977 3315.10277 4063.02968 3314.72924 4062.86625 3314.37876 4062.64445 3314.06199 4062.37101 3313.78855 4062.05424 3313.56675 4061.70376 3313.40332 4061.33023 3313.30323 4060.945 3313.26953 4060.55977 3313.30323 4060.18624 3313.40332 4059.90058 3313.53652 4059.73153 3313.574 4058.69404 3313.574 4058.58331 3313.55837 4058.48123 3313.51269 4058.28516 3313.38949 4058.07011 3313.31424 4057.82124 3313.2862 4051.6868 3313.2862 4051.53373 3313.25575 4051.40396 3313.16904 4051.31725 3313.03927 4051.2868 3312.8862 4051.2868 3309.21076 4051.25876 3308.96189 4051.18351 3308.74684 4051.06229 3308.55392 4050.90118 3308.39281 4050.70826 3308.27159 4050.49321 3308.19634 4050.24434 3308.1683 4043.20266 3308.1683 4042.95379 3308.19634 4042.57024 3308.33517 4042.40151 3308.32189 4042.25337 3308.24002 4042.15236 3308.10422 4042.11655 3307.93879 4042.11655 3305.84447 4042.147 3305.6914 4042.23371 3305.56163 4049.82493 3297.97041 4049.9547 3297.8837 4050.10777 3297.85325 4081.59207 3297.85325 4081.76112 3297.89073 4081.85324 3297.93368 4082.22677 3298.03377 4082.612 3298.06747 4082.82688 3298.0502 4084.89712 3298.0502 4085.112 3298.06747 4085.49723 3298.03377 4085.87076 3297.93368 4086.22124 3297.77025 4086.53801 3297.54845 4086.81145 3297.27501 4087.03325 3296.95824 4087.19668 3296.60776 4087.29677 3296.23423 4087.33047 3295.849 4087.29677 3295.46377 4087.19668 3295.09024 4087.03325 3294.73976 4086.81145 3294.42299 4086.53801 3294.14955 4086.22124 3293.92775 4085.87076 3293.76432 4085.49723 3293.66423 4085.112 3293.63053 4084.89483 3293.648 4082.82917 3293.648 4082.612 3293.63053 4082.22677 3293.66423 4081.85324 3293.76432 4081.76112 3293.80727 4081.59207 3293.84475 4049.12063 3293.84475 4048.93725 3293.85276 4048.76393 3293.87557 4048.59326 3293.91341 4048.42654 3293.96598 4048.26503 3294.03288 4048.10997 3294.1136 4047.96253 3294.20753 4047.82384 3294.31395 4047.68851 3294.43795 4038.70125 3303.42521 4038.57725 3303.56054 4038.47083 3303.69923 4038.3769 3303.84667 4038.29618 3304.00173 4038.22928 3304.16324 4038.17671 3304.32996 4038.13887 3304.50063 4038.11606 3304.67395 4038.10805 3304.85733 4038.10805 3320.33987 4038.11606 3320.52325 4038.13887 3320.69657 4038.17671 3320.86724 4038.22928 3321.03396 4038.29618 3321.19547 4038.3769 3321.35053 4038.47083 3321.49797 4038.57725 3321.63666 4038.70125 3321.77199 4040.24457 3323.31531 4040.33128 3323.44508 4040.36173 3323.59815 4040.33128 3323.75122 4040.24457 3323.88099 4030.89697 3333.22859 4030.7672 3333.3153 4030.61413 3333.34575 3950.38587 3333.34575 3950.2328 3333.3153 3950.10303 3333.22859 3947.12339 3330.24895 3947.03344 3330.11111 3947.00661 3329.94871 3947.04745 3329.78926 3947.14904 3329.65976 3947.29418 3329.58213 3947.45829 3329.56951 3947.61359 3329.62405 3948.02023 3329.87056 3948.53177 3330.097 3949.06806 3330.25617 3949.6203 3330.34545 3950.17943 3330.36338 3950.73625 3330.30967 3951.28164 3330.18519 3951.80663 3329.99198 3952.30261 3329.73323 3952.76142 3329.41318 3953.17554 3329.03709 3953.53817 3328.61113 3953.84335 3328.14229 3954.08607 3327.63828 3954.26235 3327.10736 3954.36928 3326.55826 3954.40513 3326 3954.36928 3325.44174 3954.26235 3324.89264 3954.08607 3324.36172 3953.84335 3323.85771 3953.53817 3323.38887 3953.17554 3322.96291 3952.76142 3322.58682 3952.30261 3322.26677 3951.80663 3322.00802 3951.28164 3321.81481 3950.73625 3321.69033 3950.17943 3321.63662 3949.6203 3321.65455 3949.06806 3321.74383 3948.53177 3321.903 3948.02023 3322.12944 3947.54185 3322.41943 3947.10449 3322.76822 3946.71531 3323.17008 3946.38072 3323.6184 3946.10621 3324.10583 3945.89628 3324.62436 3945.75438 3325.16547 3945.68284 3325.72029 3945.68284 3326.27971 3945.75438 3326.83453 3945.89628 3327.37564 3946.10588 3327.89336 3946.40542 3328.41982 3946.45548 3328.575 3946.43946 3328.73726 3946.36001 3328.87964 3946.23034 3328.97849 3946.072 3329.01738 3945.91129 3328.98986 3945.77492 3328.90048 3944.36699 3327.49256 3944.29131 3327.38709 3944.25339 3327.26294 3944.25722 3327.13319 3944.36929 3326.55823 3944.40513 3326 3944.36928 3325.44174 3944.26235 3324.89264 3944.08607 3324.36172 3943.84335 3323.85771 3943.53817 3323.38887 3943.17554 3322.96291 3942.76142 3322.58682 3942.30261 3322.26677 3941.80663 3322.00802 3941.28164 3321.81481 3940.73625 3321.69033 3940.17943 3321.63662 3939.6203 3321.65455 3939.06806 3321.74383 3938.53177 3321.903 3938.02023 3322.12944 3937.54185 3322.41943 3937.10449 3322.76822 3936.71531 3323.17008 3936.38072 3323.6184 3936.17207 3323.98889 3936.08283 3324.09718 3935.96168 3324.16799 3935.82354 3324.1926 3934.80595 3324.1926 3934.65288 3324.16215 3934.52311 3324.07544 3934.4364 3323.94567 3934.40595 3323.7926 3934.40595 3322.67601 3934.37791 3322.42714 3934.30266 3322.21209 3934.18144 3322.01917 3934.02033 3321.85806 3933.82741 3321.73684 3933.61236 3321.66159 3933.36349 3321.63355 3926.71551 3321.63355 3926.46664 3321.66159 3926.25159 3321.73684 3926.05867 3321.85806 3925.89756 3322.01917 3925.77634 3322.21209 3925.70109 3322.42714 3925.67305 3322.67601 3925.67305 3329.32399 3925.70109 3329.57286 3925.77634 3329.78791 3925.89756 3329.98083 3926.05867 3330.14194 3926.25159 3330.26316 3926.46664 3330.33841 3926.71551 3330.36645 3933.36349 3330.36645 3933.61236 3330.33841 3933.82741 3330.26316 3934.02033 3330.14194 3934.18144 3329.98083 3934.30266 3329.78791 3934.37791 3329.57286 3934.40595 3329.32399 3934.40595 3328.2074 3934.4364 3328.05433 3934.52311 3327.92456 3934.65288 3327.83785 3934.80595 3327.8074 3935.82354 3327.8074 3935.96168 3327.83201 3936.08283 3327.90282 3936.17207 3328.01111 3936.38072 3328.3816 3936.71531 3328.82992 3937.10449 3329.23178 3937.54185 3329.58057 3938.02023 3329.87056 3938.53177 3330.097 3939.06806 3330.25617 3939.6203 3330.34545 3940.17943 3330.36338 3940.73625 3330.30967 3941.15494 3330.2141 3941.28874 3330.20659 3941.41751 3330.24369 3941.52679 3330.32123 3947.96661 3336.76105 3948.10194 3336.88505 3948.24063 3336.99147 3948.38807 3337.0854 3948.54313 3337.16612 3948.70464 3337.23302 3948.87136 3337.28559 3949.04203 3337.32343 3949.21535 3337.34624 3949.39873 3337.35425 4031.60127 3337.35425 Z M 4012.25537 3330.48169 L 4012.82382 3330.55351 4013.39678 3330.55351 4013.96523 3330.48169 4014.52019 3330.3392 4015.05292 3330.12828 4015.55501 3329.85225 4016.01855 3329.51547 4016.43623 3329.12325 4016.80145 3328.68178 4017.10846 3328.19801 4017.35241 3327.67957 4017.52947 3327.13465 4017.63683 3326.57183 4017.67281 3326 4017.63683 3325.42817 4017.52947 3324.86535 4017.35241 3324.32043 4017.10846 3323.80199 4016.80145 3323.31822 4016.43623 3322.87675 4016.01855 3322.48453 4015.55501 3322.14775 4015.32185 3322.01956 4015.21175 3321.93041 4015.13964 3321.80847 4015.11455 3321.66904 4015.11455 3320.33096 4015.13964 3320.19153 4015.21175 3320.06959 4015.32185 3319.98044 4015.55501 3319.85225 4016.01855 3319.51547 4016.43623 3319.12325 4016.80145 3318.68178 4017.10846 3318.19801 4017.35241 3317.67957 4017.52947 3317.13465 4017.63683 3316.57183 4017.67281 3316 4017.63683 3315.42817 4017.52947 3314.86535 4017.49477 3314.75854 4017.47574 3314.614 4017.50977 3314.47224 4017.59235 3314.35209 4017.86416 3314.08028 4017.97977 3313.99976 4018.11613 3313.96432 4018.25632 3313.97835 4021.08865 3313.97835 4021.08865 3311.14602 4021.07462 3311.00583 4021.11006 3310.86947 4021.19058 3310.75386 4039.97303 3291.97141 4040.1028 3291.8847 4040.25587 3291.85425 4086.11413 3291.85425 4086.2672 3291.8847 4086.39697 3291.97141 4089.48859 3295.06303 4089.5753 3295.1928 4089.60575 3295.34587 4089.60575 3300.84127 4089.61376 3301.02465 4089.63657 3301.19797 4089.67441 3301.36864 4089.72698 3301.53536 4089.79388 3301.69687 4089.8746 3301.85193 4089.96853 3301.99937 4090.07495 3302.13806 4090.19895 3302.27339 4096.55661 3308.63105 4096.69194 3308.75505 4096.83063 3308.86147 4096.97807 3308.9554 4097.13313 3309.03612 4097.29464 3309.10302 4097.46136 3309.15559 4097.63203 3309.19343 4097.80535 3309.21624 4097.98873 3309.22425 4098.57303 3309.22425 4098.6922 3309.24241 4098.80055 3309.29526 4098.88823 3309.37799 4099.07317 3309.6147 4099.43226 3309.96146 4099.83611 3310.25488 4100.27687 3310.48923 4100.74595 3310.65996 4101.23423 3310.76375 4101.7322 3310.79857 4102.23017 3310.76375 4102.71845 3310.65996 4103.18753 3310.48923 4103.62829 3310.25488 4104.03214 3309.96146 4104.39123 3309.6147 4104.69856 3309.22133 4104.94815 3308.78902 4105.13515 3308.32619 4105.25591 3307.84183 4105.30809 3307.34537 4105.29067 3306.84649 4105.20399 3306.35489 4105.04973 3305.88013 4104.8309 3305.43146 4104.55176 3305.01762 4104.21774 3304.64665 4103.83534 3304.32578 4103.412 3304.06125 4102.95597 3303.85821 4102.47612 3303.72062 4101.98179 3303.65114 4101.48261 3303.65114 4100.98828 3303.72062 4100.50843 3303.85821 4100.0524 3304.06125 4099.62906 3304.32578 4099.24666 3304.64665 4099.05227 3304.86254 4098.92248 3304.95815 4098.76548 3304.99475 4098.60679 3304.96641 4098.47217 3304.87773 4093.73141 3300.13697 4093.6447 3300.0072 4093.61425 3299.85413 4093.61425 3294.35873 4093.60624 3294.17535 4093.58343 3294.00203 4093.54559 3293.83136 4093.49302 3293.66464 4093.42612 3293.50313 4093.3454 3293.34807 4093.25147 3293.20063 4093.14505 3293.06194 4093.02105 3292.92661 4088.53339 3288.43895 4088.39806 3288.31495 4088.25937 3288.20853 4088.11193 3288.1146 4087.95687 3288.03388 4087.79536 3287.96698 4087.62864 3287.91441 4087.45797 3287.87657 4087.28465 3287.85376 4087.10127 3287.84575 4039.26873 3287.84575 4039.08535 3287.85376 4038.91203 3287.87657 4038.74136 3287.91441 4038.57464 3287.96698 4038.41313 3288.03388 4038.25807 3288.1146 4038.11063 3288.20853 4037.97194 3288.31495 4037.83661 3288.43895 4014.75678 3311.51879 4014.64424 3311.59787 4014.51158 3311.63417 4014.37446 3311.62338 4013.96523 3311.51831 4013.39678 3311.44649 4012.82382 3311.44649 4012.25537 3311.51831 4011.70041 3311.6608 4011.16768 3311.87172 4010.66559 3312.14775 4010.20205 3312.48453 4009.78437 3312.87675 4009.41915 3313.31822 4009.11214 3313.80199 4008.86819 3314.32043 4008.69113 3314.86535 4008.58377 3315.42817 4008.54779 3316 4008.58377 3316.57183 4008.69113 3317.13465 4008.86819 3317.67957 4009.11214 3318.19801 4009.41915 3318.68178 4009.78437 3319.12325 4010.20205 3319.51547 4010.66559 3319.85225 4010.89875 3319.98044 4011.00885 3320.06959 4011.08096 3320.19153 4011.10605 3320.33096 4011.10605 3321.66904 4011.08096 3321.80847 4011.00885 3321.93041 4010.89875 3322.01956 4010.66559 3322.14775 4010.20205 3322.48453 4009.78437 3322.87675 4009.41915 3323.31822 4009.11214 3323.80199 4008.86819 3324.32043 4008.69113 3324.86535 4008.58377 3325.42817 4008.54779 3326 4008.58377 3326.57183 4008.69113 3327.13465 4008.86819 3327.67957 4009.11214 3328.19801 4009.41915 3328.68178 4009.78437 3329.12325 4010.20205 3329.51547 4010.66559 3329.85225 4011.16768 3330.12828 4011.70041 3330.3392 4012.25537 3330.48169 Z M 3901.1369 3351.02665 L 3901.78 3351.06277 3902.4231 3351.02665 3903.05811 3350.91876 3903.67705 3350.74045 3904.27213 3350.49396 3904.83587 3350.18239 3905.36118 3349.80966 3905.84146 3349.38046 3906.27066 3348.90018 3906.64339 3348.37487 3906.95496 3347.81113 3907.20145 3347.21605 3907.37976 3346.59711 3907.48765 3345.9621 3907.52377 3345.319 3907.48765 3344.6759 3907.37976 3344.04089 3907.20145 3343.42195 3906.95496 3342.82687 3906.64339 3342.26313 3906.27066 3341.73782 3905.84146 3341.25754 3905.36118 3340.82834 3904.83587 3340.45561 3904.27213 3340.14404 3903.67705 3339.89755 3903.05811 3339.71924 3902.4231 3339.61135 3901.78 3339.57523 3901.1369 3339.61135 3900.50189 3339.71924 3899.88295 3339.89755 3899.28787 3340.14404 3898.72413 3340.45561 3898.19882 3340.82834 3897.71854 3341.25754 3897.28934 3341.73782 3896.91661 3342.26313 3896.60504 3342.82687 3896.35855 3343.42195 3896.18024 3344.04089 3896.07235 3344.6759 3896.03623 3345.319 3896.07235 3345.9621 3896.18024 3346.59711 3896.35855 3347.21605 3896.60504 3347.81113 3896.91661 3348.37487 3897.28934 3348.90018 3897.71854 3349.38046 3898.19882 3349.80966 3898.72413 3350.18239 3899.28787 3350.49396 3899.88295 3350.74045 3900.50189 3350.91876 3901.1369 3351.02665 Z M 4138 3351.06277 L 4138.6431 3351.02665 4139.27811 3350.91876 4139.89705 3350.74045 4140.49213 3350.49396 4141.05587 3350.18239 4141.58118 3349.80966 4142.06146 3349.38046 4142.49066 3348.90018 4142.86339 3348.37487 4143.17496 3347.81113 4143.42145 3347.21605 4143.59976 3346.59711 4143.70765 3345.9621 4143.74377 3345.319 4143.70765 3344.6759 4143.59976 3344.04089 4143.42145 3343.42195 4143.17496 3342.82687 4142.86339 3342.26313 4142.49066 3341.73782 4142.06146 3341.25754 4141.58118 3340.82834 4141.05587 3340.45561 4140.49213 3340.14404 4139.89705 3339.89755 4139.27811 3339.71924 4138.6431 3339.61135 4138 3339.57523 4137.3569 3339.61135 4136.72189 3339.71924 4136.10295 3339.89755 4135.50787 3340.14404 4134.94413 3340.45561 4134.41882 3340.82834 4133.93854 3341.25754 4133.50934 3341.73782 4133.13661 3342.26313 4132.82504 3342.82687 4132.57855 3343.42195 4132.40024 3344.04089 4132.29235 3344.6759 4132.25623 3345.319 4132.29235 3345.9621 4132.40024 3346.59711 4132.57855 3347.21605 4132.82504 3347.81113 4133.13661 3348.37487 4133.50934 3348.90018 4133.93854 3349.38046 4134.41882 3349.80966 4134.94413 3350.18239 4135.50787 3350.49396 4136.10295 3350.74045 4136.72189 3350.91876 4137.3569 3351.02665 4138 3351.06277 Z M 3901.78 3302.24377 L 3902.4231 3302.20765 3903.05811 3302.09976 3903.67705 3301.92145 3904.27213 3301.67496 3904.83587 3301.36339 3905.36118 3300.99066 3905.84146 3300.56146 3906.27066 3300.08118 3906.64339 3299.55587 3906.95496 3298.99213 3907.20145 3298.39705 3907.37976 3297.77811 3907.48765 3297.1431 3907.52377 3296.5 3907.48765 3295.8569 3907.37976 3295.22189 3907.20145 3294.60295 3906.95496 3294.00787 3906.64339 3293.44413 3906.27066 3292.91882 3905.84146 3292.43854 3905.36118 3292.00934 3904.83587 3291.63661 3904.27213 3291.32504 3903.67705 3291.07855 3903.05811 3290.90024 3902.4231 3290.79235 3901.78 3290.75623 3901.1369 3290.79235 3900.50189 3290.90024 3899.88295 3291.07855 3899.28787 3291.32504 3898.72413 3291.63661 3898.19882 3292.00934 3897.71854 3292.43854 3897.28934 3292.91882 3896.91661 3293.44413 3896.60504 3294.00787 3896.35855 3294.60295 3896.18024 3295.22189 3896.07235 3295.8569 3896.03623 3296.5 3896.07235 3297.1431 3896.18024 3297.77811 3896.35855 3298.39705 3896.60504 3298.99213 3896.91661 3299.55587 3897.28934 3300.08118 3897.71854 3300.56146 3898.19882 3300.99066 3898.72413 3301.36339 3899.28787 3301.67496 3899.88295 3301.92145 3900.50189 3302.09976 3901.1369 3302.20765 3901.78 3302.24377 Z M 4138 3302.24377 L 4138.6431 3302.20765 4139.27811 3302.09976 4139.89705 3301.92145 4140.49213 3301.67496 4141.05587 3301.36339 4141.58118 3300.99066 4142.06146 3300.56146 4142.49066 3300.08118 4142.86339 3299.55587 4143.17496 3298.99213 4143.42145 3298.39705 4143.59976 3297.77811 4143.70765 3297.1431 4143.74377 3296.5 4143.70765 3295.8569 4143.59976 3295.22189 4143.42145 3294.60295 4143.17496 3294.00787 4142.86339 3293.44413 4142.49066 3292.91882 4142.06146 3292.43854 4141.58118 3292.00934 4141.05587 3291.63661 4140.49213 3291.32504 4139.89705 3291.07855 4139.27811 3290.90024 4138.6431 3290.79235 4138 3290.75623 4137.3569 3290.79235 4136.72189 3290.90024 4136.10295 3291.07855 4135.50787 3291.32504 4134.94413 3291.63661 4134.41882 3292.00934 4133.93854 3292.43854 4133.50934 3292.91882 4133.13661 3293.44413 4132.82504 3294.00787 4132.57855 3294.60295 4132.40024 3295.22189 4132.29235 3295.8569 4132.25623 3296.5 4132.29235 3297.1431 4132.40024 3297.77811 4132.57855 3298.39705 4132.82504 3298.99213 4133.13661 3299.55587 4133.50934 3300.08118 4133.93854 3300.56146 4134.41882 3300.99066 4134.94413 3301.36339 4135.50787 3301.67496 4136.10295 3301.92145 4136.72189 3302.09976 4137.3569 3302.20765 4138 3302.24377 Z M 4101.7322 3328.51507 L 4102.23017 3328.48025 4102.71845 3328.37646 4103.18753 3328.20573 4103.62829 3327.97138 4104.03214 3327.67796 4104.39123 3327.3312 4104.69856 3326.93783 4104.94815 3326.50552 4105.13515 3326.04269 4105.25591 3325.55833 4105.30809 3325.06187 4105.29067 3324.56299 4105.20399 3324.07139 4105.04973 3323.59663 4104.8309 3323.14796 4104.55176 3322.73412 4104.21774 3322.36315 4103.83534 3322.04228 4103.412 3321.77775 4102.95597 3321.57471 4102.47396 3321.43649 4102.22587 3321.39878 4102.07752 3321.34472 4101.96166 3321.23746 4101.89632 3321.09372 4101.8917 3320.9359 4101.94851 3320.78859 4102.05789 3320.67473 4102.20281 3320.61207 4102.71845 3320.50246 4103.18753 3320.33173 4103.62829 3320.09738 4104.03214 3319.80396 4104.39123 3319.4572 4104.69856 3319.06383 4104.94815 3318.63152 4105.13515 3318.16869 4105.25591 3317.68433 4105.30809 3317.18787 4105.29067 3316.68899 4105.20399 3316.19739 4105.04973 3315.72263 4104.8309 3315.27396 4104.55176 3314.86012 4104.21774 3314.48915 4103.83534 3314.16828 4103.412 3313.90375 4102.95597 3313.70071 4102.47612 3313.56312 4101.98179 3313.49364 4101.48261 3313.49364 4100.98828 3313.56312 4100.50843 3313.70071 4100.0524 3313.90375 4099.62906 3314.16828 4099.24666 3314.48915 4098.91264 3314.86012 4098.6335 3315.27396 4098.41467 3315.72263 4098.26041 3316.19739 4098.17373 3316.68899 4098.15631 3317.18787 4098.20849 3317.68433 4098.32925 3318.16869 4098.51625 3318.63152 4098.76584 3319.06383 4099.07317 3319.4572 4099.43226 3319.80396 4099.83611 3320.09738 4100.27687 3320.33173 4100.74526 3320.50221 4101.27506 3320.61281 4101.42091 3320.67542 4101.53092 3320.78983 4101.58778 3320.93802 4101.58253 3321.09665 4101.516 3321.24076 4101.39866 3321.34764 4101.24899 3321.40048 4100.98828 3321.43712 4100.50843 3321.57471 4100.0524 3321.77775 4099.62906 3322.04228 4099.24666 3322.36315 4098.91264 3322.73412 4098.6335 3323.14796 4098.41467 3323.59663 4098.26041 3324.07139 4098.17373 3324.56299 4098.15631 3325.06187 4098.20849 3325.55833 4098.32925 3326.04269 4098.51625 3326.50552 4098.76584 3326.93783 4099.07317 3327.3312 4099.43226 3327.67796 4099.83611 3327.97138 4100.27687 3328.20573 4100.74595 3328.37646 4101.23423 3328.48025 4101.7322 3328.51507 Z M 4003.39678 3320.55351 L 4003.96523 3320.48169 4004.52019 3320.3392 4005.05292 3320.12828 4005.55501 3319.85225 4006.01855 3319.51547 4006.43623 3319.12325 4006.80145 3318.68178 4007.10846 3318.19801 4007.35241 3317.67957 4007.52947 3317.13465 4007.63683 3316.57183 4007.67281 3316 4007.63683 3315.42817 4007.52947 3314.86535 4007.35241 3314.32043 4007.10846 3313.80199 4006.80145 3313.31822 4006.43623 3312.87675 4006.01855 3312.48453 4005.55501 3312.14775 4005.05292 3311.87172 4004.52019 3311.6608 4003.96523 3311.51831 4003.39678 3311.44649 4002.82382 3311.44649 4002.25537 3311.51831 4001.70041 3311.6608 4001.16768 3311.87172 4000.66559 3312.14775 4000.20205 3312.48453 3999.78437 3312.87675 3999.41915 3313.31822 3999.11214 3313.80199 3998.86819 3314.32043 3998.69113 3314.86535 3998.58377 3315.42817 3998.54779 3316 3998.58377 3316.57183 3998.69113 3317.13465 3998.86819 3317.67957 3999.11214 3318.19801 3999.41915 3318.68178 3999.78437 3319.12325 4000.20205 3319.51547 4000.66559 3319.85225 4001.16768 3320.12828 4001.70041 3320.3392 4002.25537 3320.48169 4002.82382 3320.55351 4003.39678 3320.55351 Z M 4003.39678 3330.55351 L 4003.96523 3330.48169 4004.52019 3330.3392 4005.05292 3330.12828 4005.55501 3329.85225 4006.01855 3329.51547 4006.43623 3329.12325 4006.80145 3328.68178 4007.10846 3328.19801 4007.35241 3327.67957 4007.52947 3327.13465 4007.63683 3326.57183 4007.67281 3326 4007.63683 3325.42817 4007.52947 3324.86535 4007.35241 3324.32043 4007.10846 3323.80199 4006.80145 3323.31822 4006.43623 3322.87675 4006.01855 3322.48453 4005.55501 3322.14775 4005.05292 3321.87172 4004.52019 3321.6608 4003.96523 3321.51831 4003.39678 3321.44649 4002.82382 3321.44649 4002.25537 3321.51831 4001.70041 3321.6608 4001.16768 3321.87172 4000.66559 3322.14775 4000.20205 3322.48453 3999.78437 3322.87675 3999.41915 3323.31822 3999.11214 3323.80199 3998.86819 3324.32043 3998.69113 3324.86535 3998.58377 3325.42817 3998.54779 3326 3998.58377 3326.57183 3998.69113 3327.13465 3998.86819 3327.67957 3999.11214 3328.19801 3999.41915 3328.68178 3999.78437 3329.12325 4000.20205 3329.51547 4000.66559 3329.85225 4001.16768 3330.12828 4001.70041 3330.3392 4002.25537 3330.48169 4002.82382 3330.55351 4003.39678 3330.55351 Z M 3960.17943 3330.36338 L 3960.73625 3330.30967 3961.28164 3330.18519 3961.80663 3329.99198 3962.30261 3329.73323 3962.76142 3329.41318 3963.17554 3329.03709 3963.53817 3328.61113 3963.84335 3328.14229 3964.08607 3327.63828 3964.26235 3327.10736 3964.36928 3326.55826 3964.40513 3326 3964.36928 3325.44174 3964.26235 3324.89264 3964.08607 3324.36172 3963.84335 3323.85771 3963.53817 3323.38887 3963.17554 3322.96291 3962.76142 3322.58682 3962.30261 3322.26677 3961.80663 3322.00802 3961.28164 3321.81481 3960.73625 3321.69033 3960.17943 3321.63662 3959.6203 3321.65455 3959.06806 3321.74383 3958.53177 3321.903 3958.02023 3322.12944 3957.54185 3322.41943 3957.10449 3322.76822 3956.71531 3323.17008 3956.38072 3323.6184 3956.10621 3324.10583 3955.89628 3324.62436 3955.75438 3325.16547 3955.68284 3325.72029 3955.68284 3326.27971 3955.75438 3326.83453 3955.89628 3327.37564 3956.10621 3327.89417 3956.38072 3328.3816 3956.71531 3328.82992 3957.10449 3329.23178 3957.54185 3329.58057 3958.02023 3329.87056 3958.53177 3330.097 3959.06806 3330.25617 3959.6203 3330.34545 3960.17943 3330.36338 Z M 3950.17943 3320.36338 L 3950.73625 3320.30967 3951.28164 3320.18519 3951.80663 3319.99198 3952.30261 3319.73323 3952.76142 3319.41318 3953.17554 3319.03709 3953.53817 3318.61113 3953.84335 3318.14229 3954.08607 3317.63828 3954.26235 3317.10736 3954.36928 3316.55826 3954.40513 3316 3954.36928 3315.44174 3954.26235 3314.89264 3954.08607 3314.36172 3953.84335 3313.85771 3953.53817 3313.38887 3953.17554 3312.96291 3952.76142 3312.58682 3952.30261 3312.26677 3951.80663 3312.00802 3951.28164 3311.81481 3950.73625 3311.69033 3950.17943 3311.63662 3949.6203 3311.65455 3949.06806 3311.74383 3948.53177 3311.903 3948.02023 3312.12944 3947.54185 3312.41943 3947.10449 3312.76822 3946.71531 3313.17008 3946.38072 3313.6184 3946.10621 3314.10583 3945.89628 3314.62436 3945.75438 3315.16547 3945.68284 3315.72029 3945.68284 3316.27971 3945.75438 3316.83453 3945.89628 3317.37564 3946.10621 3317.89417 3946.38072 3318.3816 3946.71531 3318.82992 3947.10449 3319.23178 3947.54185 3319.58057 3948.02023 3319.87056 3948.53177 3320.097 3949.06806 3320.25617 3949.6203 3320.34545 3950.17943 3320.36338 Z M 3930.17943 3320.36338 L 3930.73625 3320.30967 3931.28164 3320.18519 3931.80663 3319.99198 3932.30261 3319.73323 3932.76142 3319.41318 3933.17554 3319.03709 3933.53817 3318.61113 3933.84335 3318.14229 3934.08607 3317.63828 3934.26235 3317.10736 3934.36928 3316.55826 3934.40513 3316 3934.36928 3315.44174 3934.26235 3314.89264 3934.08607 3314.36172 3933.84335 3313.85771 3933.53817 3313.38887 3933.17554 3312.96291 3932.76142 3312.58682 3932.30261 3312.26677 3931.80663 3312.00802 3931.28164 3311.81481 3930.73625 3311.69033 3930.17943 3311.63662 3929.6203 3311.65455 3929.06806 3311.74383 3928.53177 3311.903 3928.02023 3312.12944 3927.54185 3312.41943 3927.10449 3312.76822 3926.71531 3313.17008 3926.38072 3313.6184 3926.10621 3314.10583 3925.89628 3314.62436 3925.75438 3315.16547 3925.68284 3315.72029 3925.68284 3316.27971 3925.75438 3316.83453 3925.89628 3317.37564 3926.10621 3317.89417 3926.38072 3318.3816 3926.71531 3318.82992 3927.10449 3319.23178 3927.54185 3319.58057 3928.02023 3319.87056 3928.53177 3320.097 3929.06806 3320.25617 3929.6203 3320.34545 3930.17943 3320.36338 Z M 3940.17943 3320.36338 L 3940.73625 3320.30967 3941.28164 3320.18519 3941.80663 3319.99198 3942.30261 3319.73323 3942.76142 3319.41318 3943.17554 3319.03709 3943.53817 3318.61113 3943.84335 3318.14229 3944.08607 3317.63828 3944.26235 3317.10736 3944.36928 3316.55826 3944.40513 3316 3944.36928 3315.44174 3944.26235 3314.89264 3944.08607 3314.36172 3943.84335 3313.85771 3943.53817 3313.38887 3943.17554 3312.96291 3942.76142 3312.58682 3942.30261 3312.26677 3941.80663 3312.00802 3941.28164 3311.81481 3940.73625 3311.69033 3940.17943 3311.63662 3939.6203 3311.65455 3939.06806 3311.74383 3938.53177 3311.903 3938.02023 3312.12944 3937.54185 3312.41943 3937.10449 3312.76822 3936.71531 3313.17008 3936.38072 3313.6184 3936.10621 3314.10583 3935.89628 3314.62436 3935.75438 3315.16547 3935.68284 3315.72029 3935.68284 3316.27971 3935.75438 3316.83453 3935.89628 3317.37564 3936.10621 3317.89417 3936.38072 3318.3816 3936.71531 3318.82992 3937.10449 3319.23178 3937.54185 3319.58057 3938.02023 3319.87056 3938.53177 3320.097 3939.06806 3320.25617 3939.6203 3320.34545 3940.17943 3320.36338 Z M 3960.17943 3320.36338 L 3960.73625 3320.30967 3961.28164 3320.18519 3961.80663 3319.99198 3962.30261 3319.73323 3962.76142 3319.41318 3963.17554 3319.03709 3963.53817 3318.61113 3963.84335 3318.14229 3964.08607 3317.63828 3964.26235 3317.10736 3964.36928 3316.55826 3964.40513 3316 3964.36928 3315.44174 3964.26235 3314.89264 3964.08607 3314.36172 3963.84335 3313.85771 3963.53817 3313.38887 3963.17554 3312.96291 3962.76142 3312.58682 3962.30261 3312.26677 3961.80663 3312.00802 3961.28164 3311.81481 3960.73625 3311.69033 3960.17943 3311.63662 3959.6203 3311.65455 3959.06806 3311.74383 3958.53177 3311.903 3958.02023 3312.12944 3957.54185 3312.41943 3957.10449 3312.76822 3956.71531 3313.17008 3956.38072 3313.6184 3956.10621 3314.10583 3955.89628 3314.62436 3955.75438 3315.16547 3955.68284 3315.72029 3955.68284 3316.27971 3955.75438 3316.83453 3955.89628 3317.37564 3956.10621 3317.89417 3956.38072 3318.3816 3956.71531 3318.82992 3957.10449 3319.23178 3957.54185 3319.58057 3958.02023 3319.87056 3958.53177 3320.097 3959.06806 3320.25617 3959.6203 3320.34545 3960.17943 3320.36338 Z M 3970.17943 3320.36338 L 3970.73625 3320.30967 3971.28164 3320.18519 3971.80663 3319.99198 3972.30261 3319.73323 3972.76142 3319.41318 3973.17554 3319.03709 3973.53817 3318.61113 3973.84335 3318.14229 3974.08607 3317.63828 3974.26235 3317.10736 3974.36928 3316.55826 3974.40513 3316 3974.36928 3315.44174 3974.26235 3314.89264 3974.08607 3314.36172 3973.84335 3313.85771 3973.53817 3313.38887 3973.17554 3312.96291 3972.76142 3312.58682 3972.30261 3312.26677 3971.80663 3312.00802 3971.28164 3311.81481 3970.73625 3311.69033 3970.17943 3311.63662 3969.6203 3311.65455 3969.06806 3311.74383 3968.53177 3311.903 3968.02023 3312.12944 3967.54185 3312.41943 3967.10449 3312.76822 3966.71531 3313.17008 3966.38072 3313.6184 3966.10621 3314.10583 3965.89628 3314.62436 3965.75438 3315.16547 3965.68284 3315.72029 3965.68284 3316.27971 3965.75438 3316.83453 3965.89628 3317.37564 3966.10621 3317.89417 3966.38072 3318.3816 3966.71531 3318.82992 3967.10449 3319.23178 3967.54185 3319.58057 3968.02023 3319.87056 3968.53177 3320.097 3969.06806 3320.25617 3969.6203 3320.34545 3970.17943 3320.36338 Z M 3970.17943 3330.36338 L 3970.73625 3330.30967 3971.28164 3330.18519 3971.80663 3329.99198 3972.30261 3329.73323 3972.76142 3329.41318 3973.17554 3329.03709 3973.53817 3328.61113 3973.84335 3328.14229 3974.08607 3327.63828 3974.26235 3327.10736 3974.36928 3326.55826 3974.40513 3326 3974.36928 3325.44174 3974.26235 3324.89264 3974.08607 3324.36172 3973.84335 3323.85771 3973.53817 3323.38887 3973.17554 3322.96291 3972.76142 3322.58682 3972.30261 3322.26677 3971.80663 3322.00802 3971.28164 3321.81481 3970.73625 3321.69033 3970.17943 3321.63662 3969.6203 3321.65455 3969.06806 3321.74383 3968.53177 3321.903 3968.02023 3322.12944 3967.54185 3322.41943 3967.10449 3322.76822 3966.71531 3323.17008 3966.38072 3323.6184 3966.10621 3324.10583 3965.89628 3324.62436 3965.75438 3325.16547 3965.68284 3325.72029 3965.68284 3326.27971 3965.75438 3326.83453 3965.89628 3327.37564 3966.10621 3327.89417 3966.38072 3328.3816 3966.71531 3328.82992 3967.10449 3329.23178 3967.54185 3329.58057 3968.02023 3329.87056 3968.53177 3330.097 3969.06806 3330.25617 3969.6203 3330.34545 3970.17943 3330.36338 Z M 4068.39544 3314.90546 L 4068.64431 3314.9335 4074.50489 3314.9335 4074.75376 3314.90546 4074.96881 3314.83021 4075.16173 3314.70899 4075.32284 3314.54788 4075.44406 3314.35496 4075.51931 3314.13991 4075.54735 3313.89104 4075.54735 3310.78636 4075.51931 3310.53749 4075.44406 3310.32244 4075.32284 3310.12952 4075.16173 3309.96841 4074.96881 3309.84719 4074.75376 3309.77194 4074.50489 3309.7439 4068.64431 3309.7439 4068.39544 3309.77194 4068.18039 3309.84719 4067.98747 3309.96841 4067.82636 3310.12952 4067.70514 3310.32244 4067.62989 3310.53749 4067.60185 3310.78636 4067.60185 3313.89104 4067.62989 3314.13991 4067.70514 3314.35496 4067.82636 3314.54788 4067.98747 3314.70899 4068.18039 3314.83021 4068.39544 3314.90546 Z M 4122.67117 3327.22404 L 4122.76291 3327.18276 4123.25476 3326.88542 4123.70718 3326.53098 4124.11358 3326.12458 4124.46802 3325.67216 4124.76536 3325.18031 4125.00123 3324.65621 4125.1728 3324.10432 4122.67117 3324.10432 4122.67117 3327.22404 Z M 4118.43102 3317.89567 L 4118.43102 3314.77596 4118.33929 3314.81724 4117.84744 3315.11458 4117.39502 3315.46902 4116.98862 3315.87542 4116.63418 3316.32784 4116.33684 3316.81969 4116.10097 3317.34379 4115.9294 3317.89567 4118.43102 3317.89567 Z M 4125.1728 3317.89567 L 4125.00123 3317.34379 4124.76536 3316.81969 4124.46802 3316.32784 4124.11358 3315.87542 4123.70718 3315.46902 4123.25476 3315.11458 4122.76291 3314.81724 4122.67117 3314.77596 4122.67117 3317.89567 4125.1728 3317.89567 Z M 4118.43102 3327.22404 L 4118.43102 3324.10432 4115.9294 3324.10432 4116.10097 3324.65621 4116.33684 3325.18031 4116.63418 3325.67216 4116.98862 3326.12458 4117.39502 3326.53098 4117.84744 3326.88542 4118.33929 3327.18276 4118.43102 3327.22404 Z M 4107.19873 3342.2444 L 4107.19873 3344.74602 4110.31844 3344.74602 4110.27716 3344.65429 4109.97982 3344.16244 4109.62538 3343.71002 4109.21898 3343.30362 4108.76656 3342.94918 4108.27471 3342.65184 4107.75061 3342.41597 4107.19873 3342.2444 Z M 4100.99002 3299.7556 L 4100.99002 3297.25398 4097.87031 3297.25398 4097.91159 3297.34571 4098.20893 3297.83756 4098.56337 3298.28998 4098.96977 3298.69638 4099.42219 3299.05082 4099.91404 3299.34816 4100.43814 3299.58403 4100.99002 3299.7556 Z M 4107.19867 3290.5122 L 4107.19867 3293.01382 4110.31839 3293.01382 4110.27711 3292.92209 4109.97977 3292.43024 4109.62533 3291.97782 4109.21893 3291.57142 4108.76651 3291.21698 4108.27466 3290.91964 4107.75056 3290.68377 4107.19867 3290.5122 Z M 4100.99007 3351.4878 L 4100.99007 3348.98618 4097.87036 3348.98618 4097.91164 3349.07791 4098.20898 3349.56976 4098.56342 3350.02218 4098.96982 3350.42858 4099.42224 3350.78302 4099.91409 3351.08036 4100.43819 3351.31623 4100.99007 3351.4878 Z M 4107.19873 3348.98618 L 4107.19873 3351.4878 4107.75061 3351.31623 4108.27471 3351.08036 4108.76656 3350.78302 4109.21898 3350.42858 4109.62538 3350.02218 4109.97982 3349.56976 4110.27716 3349.07791 4110.31844 3348.98618 4107.19873 3348.98618 Z M 4107.19867 3297.25398 L 4107.19867 3299.7556 4107.75056 3299.58403 4108.27466 3299.34816 4108.76651 3299.05082 4109.21893 3298.69638 4109.62533 3298.28998 4109.97977 3297.83756 4110.27711 3297.34571 4110.31839 3297.25398 4107.19867 3297.25398 Z M 4097.91164 3344.65429 L 4097.87036 3344.74602 4100.99007 3344.74602 4100.99007 3342.2444 4100.43819 3342.41597 4099.91409 3342.65184 4099.42224 3342.94918 4098.96982 3343.30362 4098.56342 3343.71002 4098.20898 3344.16244 4097.91164 3344.65429 Z M 4100.99002 3293.01382 L 4100.99002 3290.5122 4100.43814 3290.68377 4099.91404 3290.91964 4099.42219 3291.21698 4098.96977 3291.57142 4098.56337 3291.97782 4098.20893 3292.43024 4097.91159 3292.92209 4097.87031 3293.01382 4100.99002 3293.01382 Z M 4027.6736 3313.97835 L 4027.6736 3312.47916 4027.64556 3312.23029 4027.57031 3312.01524 4027.44909 3311.82232 4027.28798 3311.66121 4027.09506 3311.53999 4026.88001 3311.46474 4026.63114 3311.4367 4025.13195 3311.4367 4025.13195 3313.97835 4027.6736 3313.97835 Z M 4019.34059 3320.53526 L 4019.58946 3320.5633 4021.08865 3320.5633 4021.08865 3318.02165 4018.547 3318.02165 4018.547 3319.52084 4018.57504 3319.76971 4018.65029 3319.98476 4018.77151 3320.17768 4018.93262 3320.33879 4019.12554 3320.46001 4019.34059 3320.53526 Z M 4025.13195 3318.02165 L 4025.13195 3320.5633 4026.63114 3320.5633 4026.88001 3320.53526 4027.09506 3320.46001 4027.28798 3320.33879 4027.44909 3320.17768 4027.57031 3319.98476 4027.64556 3319.76971 4027.6736 3319.52084 4027.6736 3318.02165 4025.13195 3318.02165 Z M 4021.08865 3330.08484 L 4021.08865 3328.02165 4019.02916 3328.02165 4019.11214 3328.19801 4019.41915 3328.68178 4019.78437 3329.12325 4020.20205 3329.51547 4020.66559 3329.85225 4021.08865 3330.08484 Z M 4025.13195 3321.91516 L 4025.13195 3323.97835 4027.19144 3323.97835 4027.10846 3323.80199 4026.80145 3323.31822 4026.43623 3322.87675 4026.01855 3322.48453 4025.55501 3322.14775 4025.13195 3321.91516 Z M 4025.13195 3328.02165 L 4025.13195 3330.08484 4025.55501 3329.85225 4026.01855 3329.51547 4026.43623 3329.12325 4026.80145 3328.68178 4027.10846 3328.19801 4027.19144 3328.02165 4025.13195 3328.02165 Z M 4021.08865 3323.97835 L 4021.08865 3321.91516 4020.66559 3322.14775 4020.20205 3322.48453 4019.78437 3322.87675 4019.41915 3323.31822 4019.11214 3323.80199 4019.02916 3323.97835 4021.08865 3323.97835 Z M 3978.11627 3329.91308 L 3978.11627 3327.92323 3976.12257 3327.92323 3976.38072 3328.3816 3976.71531 3328.82992 3977.10449 3329.23178 3977.54185 3329.58057 3978.02023 3329.87056 3978.11627 3329.91308 Z M 3978.11627 3319.91308 L 3978.11627 3317.92323 3976.12257 3317.92323 3976.38072 3318.3816 3976.71531 3318.82992 3977.10449 3319.23178 3977.54185 3319.58057 3978.02023 3319.87056 3978.11627 3319.91308 Z M 3978.11627 3324.07677 L 3978.11627 3322.08692 3978.02023 3322.12944 3977.54185 3322.41943 3977.10449 3322.76822 3976.71531 3323.17008 3976.38072 3323.6184 3976.12257 3324.07677 3978.11627 3324.07677 Z M 3978.11627 3314.07677 L 3978.11627 3312.08692 3978.02023 3312.12944 3977.54185 3312.41943 3977.10449 3312.76822 3976.71531 3313.17008 3976.38072 3313.6184 3976.12257 3314.07677 3978.11627 3314.07677 Z M 3981.96272 3317.92323 L 3981.96272 3319.91055 3982.30261 3319.73323 3982.76142 3319.41318 3983.17554 3319.03709 3983.53817 3318.61113 3983.84335 3318.14229 3983.94885 3317.92323 3981.96272 3317.92323 Z M 3981.96272 3327.92323 L 3981.96272 3329.91055 3982.30261 3329.73323 3982.76142 3329.41318 3983.17554 3329.03709 3983.53817 3328.61113 3983.84335 3328.14229 3983.94885 3327.92323 3981.96272 3327.92323 Z M 3981.96272 3312.08945 L 3981.96272 3314.07677 3983.94885 3314.07677 3983.84335 3313.85771 3983.53817 3313.38887 3983.17554 3312.96291 3982.76142 3312.58682 3982.30261 3312.26677 3981.96272 3312.08945 Z M 3983.94885 3324.07677 L 3983.84335 3323.85771 3983.53817 3323.38887 3983.17554 3322.96291 3982.76142 3322.58682 3982.30261 3322.26677 3981.96272 3322.08945 3981.96272 3324.07677 3983.94885 3324.07677 Z M 4104.96391 3333.24998 L 4104.94815 3333.21098 4104.69856 3332.77867 4104.39123 3332.3853 4104.03214 3332.03854 4103.62829 3331.74512 4103.26173 3331.55022 4103.26173 3333.24998 4104.96391 3333.24998 Z M 4098.51625 3333.21098 L 4098.50049 3333.24998 4100.20268 3333.24998 4100.20268 3331.55022 4099.83611 3331.74512 4099.43226 3332.03854 4099.07317 3332.3853 4098.76584 3332.77867 4098.51625 3333.21098 Z M 4100.20268 3338.00566 L 4100.20268 3336.30903 4098.50693 3336.30903 4098.6335 3336.56854 4098.91264 3336.98238 4099.24666 3337.35335 4099.62906 3337.67422 4100.0524 3337.93875 4100.20268 3338.00566 Z M 4103.26173 3336.30903 L 4103.26173 3338.00566 4103.412 3337.93875 4103.83534 3337.67422 4104.21774 3337.35335 4104.55176 3336.98238 4104.8309 3336.56854 4104.95747 3336.30903 4103.26173 3336.30903 Z M 4057.82124 3328.712 L 4058.07011 3328.68396 4058.28516 3328.60871 4058.47808 3328.48749 4058.63919 3328.32638 4058.76041 3328.13346 4058.83566 3327.91841 4058.8637 3327.66954 4058.8637 3327.5483 4056.5189 3327.5483 4056.5189 3328.712 4057.82124 3328.712 Z M 4084.8166 3315.05875 L 4084.8166 3316.32087 4086.7677 3316.32087 4086.7677 3316.10121 4086.73966 3315.85234 4086.66441 3315.63729 4086.54319 3315.44437 4086.38208 3315.28326 4086.18916 3315.16204 4085.97411 3315.08679 4085.72524 3315.05875 4084.8166 3315.05875 Z M 4080.0033 3316.10121 L 4080.0033 3316.32087 4081.9544 3316.32087 4081.9544 3315.05875 4081.04576 3315.05875 4080.79689 3315.08679 4080.58184 3315.16204 4080.38892 3315.28326 4080.22781 3315.44437 4080.10659 3315.63729 4080.03134 3315.85234 4080.0033 3316.10121 Z "}],"B":[{"net":"GND","svgpath":"M 4076.06678 3306.78966 L 4075.90206 3306.84093 4075.73106 3306.81806 4075.58559 3306.7253 4075.16726 3306.30726 4075.08048 3306.17745 4075.05 3306.02431 4075.05 3304.46088 4075.0819 3304.30176 4075.16334 3304.16495 4075.2917 3304.07075 4075.44663 3304.03408 4075.60359 3304.06075 4075.73772 3304.14653 4075.82776 3304.27784 4075.85945 3304.43387 4075.85945 3305.22035 4075.89229 3305.55383 4075.98383 3305.85559 4076.13249 3306.1337 4076.17754 3306.1886 4076.25565 3306.34243 4076.26171 3306.51484 4076.1946 3306.67377 4076.06678 3306.78966 Z "},{"net":"GND","svgpath":"M 3977.51442 3330.29312 L 3977.34666 3330.33 3972.71969 3330.33 3972.55582 3330.29489 3972.42072 3330.19574 3972.33809 3330.04994 3972.32245 3329.88309 3972.37653 3329.72447 3972.49084 3329.60193 3972.76142 3329.41318 3973.17554 3329.03709 3973.53817 3328.61113 3973.84335 3328.14229 3974.08607 3327.63828 3974.26235 3327.10736 3974.36928 3326.55826 3974.40513 3326 3974.36928 3325.44174 3974.26235 3324.89264 3974.08607 3324.36172 3973.84335 3323.85771 3973.53817 3323.38887 3973.17554 3322.96291 3972.76142 3322.58682 3972.30261 3322.26677 3971.80663 3322.00802 3971.28164 3321.81481 3970.73625 3321.69033 3970.17943 3321.63662 3969.6203 3321.65455 3969.06806 3321.74383 3968.60191 3321.88218 3968.46048 3321.89776 3968.32253 3321.86284 3968.20555 3321.78184 3966.74744 3320.3267 3966.66053 3320.19683 3966.63 3320.04357 3966.63 3319.684 3966.65765 3319.53786 3966.73678 3319.41193 3966.85645 3319.32361 3967.00011 3319.28511 3967.1479 3319.30177 3967.2794 3319.37126 3967.54185 3319.58057 3968.02023 3319.87056 3968.53177 3320.097 3969.06806 3320.25617 3969.6203 3320.34545 3970.17943 3320.36338 3970.73625 3320.30967 3971.28164 3320.18519 3971.80663 3319.99198 3972.30261 3319.73323 3972.76142 3319.41318 3973.17554 3319.03709 3973.53817 3318.61113 3973.84335 3318.14229 3974.08607 3317.63828 3974.26235 3317.10736 3974.36928 3316.55826 3974.40513 3316 3974.36928 3315.44174 3974.26235 3314.89264 3974.08607 3314.36172 3973.84335 3313.85771 3973.53817 3313.38887 3973.40158 3313.22842 3973.32808 3313.09973 3973.30648 3312.95311 3973.33975 3312.80869 3973.42332 3312.68629 3973.93245 3312.17716 3974.06222 3312.09045 3974.21529 3312.06 3976.84943 3312.06 3977.00175 3312.09014 3977.13112 3312.176 3977.21804 3312.30466 3977.24942 3312.45673 3977.22053 3312.60928 3977.13573 3312.73935 3976.71486 3313.17068 3976.38072 3313.6184 3976.12257 3314.07677 3978.11627 3314.07677 3978.11627 3312.46 3978.14672 3312.30693 3978.23343 3312.17716 3978.3632 3312.09045 3978.51627 3312.06 3981.56272 3312.06 3981.7158 3312.09045 3981.84557 3312.17716 3981.93228 3312.30693 3981.96272 3312.46 3981.96272 3314.07677 3983.94885 3314.07677 3983.84335 3313.85771 3983.53817 3313.38887 3983.17554 3312.96291 3982.94784 3312.75611 3982.85363 3312.62775 3982.81696 3312.47282 3982.84363 3312.31586 3982.92942 3312.18173 3983.06073 3312.09169 3983.21676 3312.06 3989.78471 3312.06 3989.93778 3312.09045 3990.06755 3312.17716 3990.15426 3312.30693 3990.18471 3312.46 3990.15426 3312.61307 3990.06755 3312.74284 3984.74123 3318.06916 3984.60825 3318.15719 3984.45145 3318.18626 3984.29575 3318.15176 3984.1659 3318.05918 3984.08255 3317.92323 3981.96272 3317.92323 3981.96272 3319.91055 3982.30261 3319.73323 3982.76142 3319.41318 3983.17515 3319.03745 3983.56117 3318.58157 3983.69414 3318.47906 3983.85745 3318.44015 3984.02235 3318.47169 3984.15978 3318.56811 3984.24554 3318.71245 3984.26451 3318.87926 3984.23 3319.22965 3984.23 3323.1146 3984.19747 3323.2726 3984.10519 3323.4049 3983.96815 3323.48999 3983.80864 3323.51403 3983.65261 3323.47312 3983.52542 3323.37389 3983.17554 3322.96291 3982.76142 3322.58682 3982.30261 3322.26677 3981.96272 3322.08945 3981.96272 3324.07677 3983.83 3324.07677 3983.98307 3324.10722 3984.11284 3324.19393 3984.19955 3324.3237 3984.23 3324.47678 3984.23 3327.41471 3984.19955 3327.56778 3984.11284 3327.69755 3984.00433 3327.80607 3983.87456 3327.89278 3983.72148 3327.92323 3981.96272 3327.92323 3981.96272 3329.68198 3981.93228 3329.83506 3981.84557 3329.96483 3981.59755 3330.21284 3981.46778 3330.29955 3981.31471 3330.33 3978.51627 3330.33 3978.3632 3330.29955 3978.23343 3330.21284 3978.14672 3330.08307 3978.11627 3329.93 3978.11627 3327.92323 3976.12257 3327.92323 3976.38072 3328.3816 3976.71531 3328.82992 3977.10449 3329.23178 3977.55402 3329.58794 3977.67836 3329.70644 3977.74154 3329.86616 3977.73191 3330.03765 3977.65124 3330.18929 3977.51442 3330.29312 Z M 3978.11627 3319.91308 L 3978.11627 3317.92323 3976.12257 3317.92323 3976.38072 3318.3816 3976.71531 3318.82992 3977.10449 3319.23178 3977.54185 3319.58057 3978.02023 3319.87056 3978.11627 3319.91308 Z M 3976.38072 3323.6184 L 3976.12257 3324.07677 3978.11627 3324.07677 3978.11627 3322.08692 3978.02023 3322.12944 3977.54185 3322.41943 3977.10449 3322.76822 3976.71531 3323.17008 3976.38072 3323.6184 Z "},{"net":"GND","svgpath":"M 4012.91529 3331.68 L 4012.76222 3331.64955 4012.63245 3331.56284 4012.27561 3331.206 4012.18578 3331.06846 4012.1588 3330.90641 4012.19924 3330.74719 4012.30027 3330.61764 4012.44485 3330.53963 4012.60859 3330.52632 4012.82382 3330.55351 4013.39678 3330.55351 4013.96523 3330.48169 4014.52019 3330.3392 4015.05292 3330.12828 4015.55501 3329.85225 4016.01855 3329.51547 4016.43623 3329.12325 4016.80145 3328.68178 4017.10846 3328.19801 4017.35241 3327.67957 4017.52947 3327.13465 4017.63683 3326.57183 4017.67281 3326 4017.63683 3325.42817 4017.52947 3324.86535 4017.35241 3324.32043 4017.10846 3323.80199 4016.80145 3323.31822 4016.43623 3322.87675 4016.01855 3322.48453 4015.55501 3322.14775 4015.05292 3321.87172 4014.52019 3321.6608 4013.96523 3321.51831 4013.39678 3321.44649 4012.82382 3321.44649 4012.25537 3321.51831 4011.70041 3321.6608 4011.16768 3321.87172 4010.66559 3322.14775 4010.34511 3322.38058 4010.18495 3322.44989 4010.01052 3322.44441 4009.85503 3322.36518 4009.74807 3322.22729 4009.71 3322.05698 4009.71 3321.09965 4009.6789 3320.78384 4009.59251 3320.49906 4009.45222 3320.23661 4009.25091 3319.9913 4007.41897 3318.15936 4007.3299 3318.02377 4007.30201 3317.86396 4007.35241 3317.67957 4007.52947 3317.13465 4007.63683 3316.57183 4007.67281 3316 4007.63683 3315.42817 4007.52947 3314.86535 4007.35241 3314.32043 4007.10846 3313.80199 4006.80145 3313.31822 4006.43623 3312.87675 4006.01855 3312.48453 4005.55501 3312.14775 4005.3236 3312.02052 4005.19269 3311.90511 4005.12338 3311.74495 4005.12886 3311.57052 4005.20809 3311.41503 4005.34599 3311.30807 4005.5163 3311.27 4010.7043 3311.27 4010.87461 3311.30807 4011.01251 3311.41503 4011.09174 3311.57052 4011.09722 3311.74495 4011.02791 3311.90511 4010.897 3312.02052 4010.66559 3312.14775 4010.20205 3312.48453 4009.78437 3312.87675 4009.41915 3313.31822 4009.11214 3313.80199 4008.86819 3314.32043 4008.69113 3314.86535 4008.58377 3315.42817 4008.54779 3316 4008.58377 3316.57183 4008.69113 3317.13465 4008.86819 3317.67957 4009.11214 3318.19801 4009.41915 3318.68178 4009.78437 3319.12325 4010.20205 3319.51547 4010.66559 3319.85225 4011.16768 3320.12828 4011.70041 3320.3392 4012.25537 3320.48169 4012.82382 3320.55351 4013.39678 3320.55351 4013.96523 3320.48169 4014.52019 3320.3392 4015.05292 3320.12828 4015.55501 3319.85225 4016.01855 3319.51547 4016.43623 3319.12325 4016.80145 3318.68178 4017.10846 3318.19801 4017.35241 3317.67957 4017.52947 3317.13465 4017.63683 3316.57183 4017.67281 3316 4017.63683 3315.42817 4017.52947 3314.86535 4017.35241 3314.32043 4017.10846 3313.80199 4016.80145 3313.31822 4016.43623 3312.87675 4016.01855 3312.48453 4015.55501 3312.14775 4015.3236 3312.02052 4015.19269 3311.90511 4015.12338 3311.74495 4015.12886 3311.57052 4015.20809 3311.41503 4015.34599 3311.30807 4015.5163 3311.27 4018.39481 3311.27 4018.56023 3311.30581 4018.69604 3311.40682 4018.77791 3311.55496 4018.79119 3311.72369 4018.7335 3311.88281 4018.65029 3312.01524 4018.57504 3312.23029 4018.547 3312.47916 4018.547 3313.97835 4021.08865 3313.97835 4021.08865 3311.67 4021.1191 3311.51693 4021.20581 3311.38716 4021.33558 3311.30045 4021.48865 3311.27 4024.73195 3311.27 4024.88502 3311.30045 4025.01479 3311.38716 4025.1015 3311.51693 4025.13195 3311.67 4025.13195 3313.97835 4027.7 3313.97835 4027.85307 3314.0088 4027.98284 3314.09551 4028.06955 3314.22528 4028.1 3314.37835 4028.1 3316.82035 4028.1311 3317.13616 4028.26999 3317.59027 4028.2662 3317.61978 4028.3828 3317.71389 4028.55909 3317.9287 4031.9013 3321.27091 4032.14661 3321.47222 4032.40906 3321.61251 4032.69384 3321.6989 4033.00965 3321.73 4041.30471 3321.73 4041.45778 3321.76045 4041.58755 3321.84716 4041.67426 3321.97693 4041.70471 3322.13 4041.67426 3322.28307 4041.58755 3322.41284 4032.43755 3331.56284 4032.30778 3331.64955 4032.15471 3331.68 4012.91529 3331.68 Z M 4021.08865 3320.5633 L 4021.08865 3318.02165 4018.547 3318.02165 4018.547 3319.52084 4018.57504 3319.76971 4018.65029 3319.98476 4018.77151 3320.17768 4018.93262 3320.33879 4019.12554 3320.46001 4019.34059 3320.53526 4019.58946 3320.5633 4021.08865 3320.5633 Z M 4026.63114 3320.5633 L 4026.88001 3320.53526 4027.09506 3320.46001 4027.28798 3320.33879 4027.44909 3320.17768 4027.57031 3319.98476 4027.64556 3319.76971 4027.6736 3319.52084 4027.6736 3318.02165 4025.13195 3318.02165 4025.13195 3320.5633 4026.63114 3320.5633 Z M 4021.08865 3330.08484 L 4021.08865 3328.02165 4019.02916 3328.02165 4019.11214 3328.19801 4019.41915 3328.68178 4019.78437 3329.12325 4020.20205 3329.51547 4020.66559 3329.85225 4021.08865 3330.08484 Z M 4025.13195 3321.91516 L 4025.13195 3323.97835 4027.19144 3323.97835 4027.10846 3323.80199 4026.80145 3323.31822 4026.43623 3322.87675 4026.01855 3322.48453 4025.55501 3322.14775 4025.13195 3321.91516 Z M 4021.08865 3323.97835 L 4021.08865 3321.91516 4020.66559 3322.14775 4020.20205 3322.48453 4019.78437 3322.87675 4019.41915 3323.31822 4019.11214 3323.80199 4019.02916 3323.97835 4021.08865 3323.97835 Z M 4025.13195 3330.08484 L 4025.55501 3329.85225 4026.01855 3329.51547 4026.43623 3329.12325 4026.80145 3328.68178 4027.10846 3328.19801 4027.19144 3328.02165 4025.13195 3328.02165 4025.13195 3330.08484 Z "},{"net":"GND","svgpath":"M 3891.389 3355.3224 L 3891.23593 3355.29195 3891.10616 3355.20524 3891.01945 3355.07547 3890.989 3354.9224 3890.989 3335.3215 3891.01945 3335.16843 3891.10616 3335.03866 3891.23593 3334.95195 3891.389 3334.9215 3899.80403 3334.9215 3900.83955 3334.8828 3900.92872 3334.87595 3901.906 3334.76313 3901.99457 3334.74945 3902.96034 3334.56215 3903.04761 3334.54173 3903.99621 3334.28105 3904.08166 3334.25401 3905.00752 3333.92148 3905.09065 3333.88797 3905.98834 3333.48554 3906.06866 3333.44578 3906.93291 3332.97581 3907.00995 3332.93001 3907.83569 3332.39527 3907.909 3332.34371 3908.69138 3331.74732 3908.76053 3331.6903 3909.49496 3331.03577 3909.55954 3330.97362 3910.24171 3330.2648 3910.30134 3330.19789 3910.92726 3329.43892 3910.98159 3329.36764 3911.54757 3328.56299 3911.59629 3328.48776 3912.09901 3327.64215 3912.14183 3327.56341 3912.57834 3326.68179 3912.61501 3326.60001 3912.98276 3325.68756 3913.01305 3325.60321 3913.30987 3324.66529 3913.33362 3324.57887 3913.55778 3323.62098 3913.57484 3323.533 3913.72501 3322.56076 3913.73529 3322.47172 3913.8106 3321.49084 3913.81403 3321.40128 3913.81403 3320.41752 3913.8106 3320.32796 3913.73529 3319.34708 3913.72501 3319.25804 3913.57484 3318.2858 3913.55778 3318.19782 3913.33362 3317.23993 3913.30987 3317.15351 3913.01305 3316.21559 3912.98276 3316.13124 3912.61501 3315.21879 3912.57834 3315.13701 3912.14183 3314.25539 3912.09901 3314.17665 3911.59629 3313.33104 3911.54757 3313.25581 3910.98159 3312.45116 3910.92726 3312.37988 3910.30134 3311.62091 3910.24171 3311.554 3909.55954 3310.84518 3909.49496 3310.78303 3908.76053 3310.1285 3908.69138 3310.07148 3907.909 3309.47509 3907.83569 3309.42353 3907.00995 3308.88879 3906.93291 3308.84299 3906.06866 3308.37302 3905.98834 3308.33326 3905.09065 3307.93083 3905.00752 3307.89732 3904.08166 3307.56479 3903.99621 3307.53775 3903.04761 3307.27707 3902.96034 3307.25665 3901.99457 3307.06935 3901.906 3307.05567 3900.92872 3306.94285 3900.83955 3306.936 3899.80403 3306.8973 3891.389 3306.8973 3891.23593 3306.86685 3891.10616 3306.78014 3891.01945 3306.65037 3890.989 3306.4973 3890.989 3286.8964 3891.01945 3286.74333 3891.10616 3286.61356 3891.23593 3286.52685 3891.389 3286.4964 4148.391 3286.4964 4148.54407 3286.52685 4148.67384 3286.61356 4148.76055 3286.74333 4148.791 3286.8964 4148.791 3306.4973 4148.76055 3306.65037 4148.67384 3306.78014 4148.54407 3306.86685 4148.391 3306.8973 4139.97597 3306.8973 4138.94045 3306.936 4138.85128 3306.94285 4137.874 3307.05567 4137.78543 3307.06935 4136.81966 3307.25665 4136.73239 3307.27707 4135.78379 3307.53775 4135.69834 3307.56479 4134.77248 3307.89732 4134.68935 3307.93083 4133.79166 3308.33326 4133.71134 3308.37302 4132.84709 3308.84299 4132.77005 3308.88879 4131.94431 3309.42353 4131.871 3309.47509 4131.08862 3310.07148 4131.01947 3310.1285 4130.28504 3310.78303 4130.22046 3310.84518 4129.53829 3311.554 4129.47866 3311.62091 4128.85274 3312.37988 4128.79841 3312.45116 4128.23243 3313.25581 4128.18371 3313.33104 4127.68099 3314.17665 4127.63817 3314.25539 4127.20166 3315.13701 4127.16499 3315.21879 4126.79724 3316.13124 4126.76695 3316.21559 4126.47013 3317.15351 4126.44638 3317.23993 4126.22222 3318.19782 4126.20516 3318.2858 4126.05499 3319.25804 4126.04471 3319.34708 4125.9694 3320.32796 4125.96597 3320.41752 4125.96597 3321.40128 4125.9694 3321.49084 4126.04426 3322.46586 4126.10683 3322.89643 4126.20516 3323.533 4126.22222 3323.62098 4126.44638 3324.57887 4126.47013 3324.66529 4126.76695 3325.60321 4126.79724 3325.68756 4127.16499 3326.60001 4127.20166 3326.68179 4127.63817 3327.56341 4127.68099 3327.64215 4128.18371 3328.48776 4128.23243 3328.56299 4128.79841 3329.36764 4128.85274 3329.43892 4129.47866 3330.19789 4129.53829 3330.2648 4130.22046 3330.97362 4130.28504 3331.03577 4131.01947 3331.6903 4131.08862 3331.74732 4131.871 3332.34371 4131.94431 3332.39527 4132.77005 3332.93001 4132.84709 3332.97581 4133.71134 3333.44578 4133.79166 3333.48554 4134.68935 3333.88797 4134.77248 3333.92148 4135.69834 3334.25401 4135.78379 3334.28105 4136.73239 3334.54173 4136.81966 3334.56215 4137.78543 3334.74945 4137.874 3334.76313 4138.85128 3334.87595 4138.94045 3334.8828 4139.97597 3334.9215 4148.391 3334.9215 4148.54407 3334.95195 4148.67384 3335.03866 4148.76055 3335.16843 4148.791 3335.3215 4148.791 3354.9224 4148.76055 3355.07547 4148.67384 3355.20524 4148.54407 3355.29195 4148.391 3355.3224 3891.389 3355.3224 Z M 3958.81384 3338.3389 L 3959.12965 3338.37 3983.09035 3338.37 3983.40616 3338.3389 3983.69094 3338.25251 3983.95339 3338.11222 3984.1987 3337.91091 3991.17091 3330.9387 3991.37222 3330.69339 3991.51251 3330.43094 3991.5989 3330.14616 3991.63 3329.83035 3991.63 3321.64529 3991.66045 3321.49222 3991.74716 3321.36245 3997.89583 3315.21378 3998.02947 3315.12549 3998.18705 3315.09671 3998.34328 3315.13206 3998.47311 3315.22587 3998.55573 3315.3631 3998.57788 3315.52174 3998.54779 3316 3998.58377 3316.57183 3998.69113 3317.13465 3998.86819 3317.67957 3999.11214 3318.19801 3999.41915 3318.68178 3999.78437 3319.12325 4000.20205 3319.51547 4000.66559 3319.85225 4001.16768 3320.12828 4001.70041 3320.3392 4002.25537 3320.48169 4002.82382 3320.55351 4003.39678 3320.55351 4003.96523 3320.48169 4004.52019 3320.3392 4004.83424 3320.21487 4004.98567 3320.1868 4005.13649 3320.21803 4005.26433 3320.30393 4006.55284 3321.59245 4006.63955 3321.72222 4006.67 3321.87529 4006.67 3322.17279 4006.63193 3322.3431 4006.52497 3322.48099 4006.36948 3322.56022 4006.19505 3322.5657 4006.03489 3322.49639 4005.55501 3322.14775 4005.05292 3321.87172 4004.52019 3321.6608 4003.96523 3321.51831 4003.39678 3321.44649 4002.82382 3321.44649 4002.25537 3321.51831 4001.70041 3321.6608 4001.16768 3321.87172 4000.66559 3322.14775 4000.20205 3322.48453 3999.78437 3322.87675 3999.41915 3323.31822 3999.11214 3323.80199 3998.86819 3324.32043 3998.69113 3324.86535 3998.58377 3325.42817 3998.54779 3326 3998.58377 3326.57183 3998.69113 3327.13465 3998.86819 3327.67957 3999.11214 3328.19801 3999.41915 3328.68178 3999.78437 3329.12325 4000.20205 3329.51547 4000.66559 3329.85225 4001.16768 3330.12828 4001.70041 3330.3392 4002.25537 3330.48169 4002.82382 3330.55351 4003.39678 3330.55351 4003.89233 3330.4909 4004.01329 3330.49407 4004.12778 3330.53327 4004.2253 3330.60491 4009.8513 3336.23091 4010.09661 3336.43222 4010.35906 3336.57251 4010.64384 3336.6589 4010.95965 3336.69 4034.10037 3336.69 4034.41585 3336.65896 4034.70066 3336.57262 4034.96315 3336.43239 4035.20849 3336.23112 4059.51721 3311.93188 4059.64699 3311.8452 4059.80005 3311.81478 4059.95311 3311.84524 4060.08286 3311.93195 4060.16956 3312.06171 4060.2 3312.21478 4060.2 3312.31035 4060.23102 3312.62531 4060.33236 3312.95436 4060.34937 3313.0959 4060.31566 3313.23441 4060.23552 3313.35231 4060.11912 3313.43461 4059.83576 3313.56675 4059.51899 3313.78855 4059.24555 3314.06199 4059.02375 3314.37876 4058.86032 3314.72924 4058.76023 3315.10277 4058.72653 3315.488 4058.76023 3315.87323 4058.86032 3316.24676 4059.02375 3316.59724 4059.24555 3316.91401 4059.31284 3316.9813 4059.39955 3317.11107 4059.43 3317.26414 4059.43 3322.16035 4059.4611 3322.47616 4059.54749 3322.76094 4059.68778 3323.02339 4059.88909 3323.2687 4067.3413 3330.72091 4067.58661 3330.92222 4067.84906 3331.06251 4068.13384 3331.1489 4068.44965 3331.18 4074.31035 3331.18 4074.62616 3331.1489 4074.91094 3331.06251 4075.17339 3330.92222 4075.4187 3330.72091 4077.75091 3328.3887 4077.95222 3328.14339 4078.09251 3327.88094 4078.1789 3327.59616 4078.21 3327.28035 4078.21 3318.25965 4078.1789 3317.94384 4078.09251 3317.65906 4077.95222 3317.39661 4077.75091 3317.1513 4069.26716 3308.66755 4069.18045 3308.53778 4069.15 3308.38471 4069.15 3304.44402 4069.17245 3304.31191 4069.21985 3304.17644 4069.30418 3304.03649 4069.43744 3303.94193 4069.5974 3303.90856 4069.75736 3303.94193 4069.89062 3304.03649 4069.97495 3304.17644 4070.02755 3304.32677 4070.05 3304.45888 4070.05 3307.59035 4070.0811 3307.90616 4070.16749 3308.19094 4070.30778 3308.45339 4070.50909 3308.6987 4086.2313 3324.42091 4086.47661 3324.62222 4086.73906 3324.76251 4087.02384 3324.8489 4087.33965 3324.88 4097.77703 3324.88 4097.92038 3324.90657 4098.04468 3324.98274 4098.13343 3325.0984 4098.17484 3325.23819 4098.20849 3325.55833 4098.32925 3326.04269 4098.51625 3326.50552 4098.76584 3326.93783 4099.07317 3327.3312 4099.43226 3327.67796 4099.83611 3327.97138 4100.27687 3328.20573 4100.74595 3328.37646 4101.23423 3328.48025 4101.7322 3328.51507 4102.23017 3328.48025 4102.71845 3328.37646 4103.18753 3328.20573 4103.62829 3327.97138 4104.03214 3327.67796 4104.39123 3327.3312 4104.69856 3326.93783 4104.94815 3326.50552 4105.13515 3326.04269 4105.25591 3325.55833 4105.30809 3325.06187 4105.29067 3324.56299 4105.20399 3324.07139 4105.04973 3323.59663 4104.8309 3323.14796 4104.55176 3322.73412 4104.21774 3322.36315 4103.83534 3322.04228 4103.412 3321.77775 4102.95597 3321.57471 4102.47396 3321.43649 4102.22587 3321.39878 4102.07752 3321.34472 4101.96166 3321.23746 4101.89632 3321.09372 4101.8917 3320.9359 4101.94851 3320.78859 4102.05789 3320.67473 4102.20281 3320.61207 4102.71845 3320.50246 4103.18753 3320.33173 4103.62829 3320.09738 4104.03214 3319.80396 4104.39123 3319.4572 4104.69856 3319.06383 4104.94815 3318.63152 4105.13515 3318.16869 4105.25591 3317.68433 4105.30809 3317.18787 4105.29067 3316.68899 4105.20399 3316.19739 4105.04973 3315.72263 4104.8309 3315.27396 4104.55176 3314.86012 4104.21774 3314.48915 4103.83534 3314.16828 4103.412 3313.90375 4102.95597 3313.70071 4102.47612 3313.56312 4101.98179 3313.49364 4101.48261 3313.49364 4100.98828 3313.56312 4100.50843 3313.70071 4100.0524 3313.90375 4099.62906 3314.16828 4099.24666 3314.48915 4098.91264 3314.86012 4098.6335 3315.27396 4098.41467 3315.72263 4098.26041 3316.19739 4098.17373 3316.68899 4098.15631 3317.18787 4098.20849 3317.68433 4098.32925 3318.16869 4098.52479 3318.64633 4098.57686 3318.81146 4098.55426 3318.98313 4098.46123 3319.12917 4098.22755 3319.36284 4098.09778 3319.44955 4097.94471 3319.48 4088.51489 3319.48 4088.36189 3319.44958 4088.23215 3319.36294 4078.76741 3309.90487 4078.67453 3309.75943 4078.65156 3309.58841 4078.70277 3309.42362 4078.81863 3309.29574 4078.97758 3309.22856 4079.15004 3309.2346 4079.30391 3309.31272 4079.3463 3309.34751 4079.62441 3309.49617 4079.92617 3309.58771 4080.25965 3309.62055 4086.52035 3309.62055 4086.85383 3309.58771 4087.15559 3309.49617 4087.4337 3309.34751 4087.69244 3309.13517 4087.78479 3309.04248 4087.91452 3308.95549 4088.06767 3308.92481 4088.22089 3308.95512 4088.35082 3309.0418 4088.43766 3309.17163 4088.46815 3309.32481 4088.46815 3315.36644 4088.49619 3315.61531 4088.57144 3315.83036 4088.69266 3316.02328 4088.85377 3316.18439 4089.04669 3316.30561 4089.26174 3316.38086 4089.51061 3316.4089 4095.37119 3316.4089 4095.62006 3316.38086 4095.83511 3316.30561 4096.02803 3316.18439 4096.18914 3316.02328 4096.31036 3315.83036 4096.38561 3315.61531 4096.41365 3315.36644 4096.41365 3307.53736 4096.38751 3307.30534 4096.40388 3307.13908 4096.48673 3306.99401 4096.62161 3306.89544 4096.78499 3306.86055 4097.75902 3306.86055 4097.91532 3306.89235 4098.04676 3306.98269 4098.13246 3307.1172 4098.15878 3307.27451 4098.15631 3307.34537 4098.20849 3307.84183 4098.32925 3308.32619 4098.51625 3308.78902 4098.76584 3309.22133 4099.07317 3309.6147 4099.43226 3309.96146 4099.83611 3310.25488 4100.27687 3310.48923 4100.74595 3310.65996 4101.23423 3310.76375 4101.7322 3310.79857 4102.23017 3310.76375 4102.71845 3310.65996 4103.18753 3310.48923 4103.62829 3310.25488 4104.03214 3309.96146 4104.39123 3309.6147 4104.69856 3309.22133 4104.94815 3308.78902 4105.13515 3308.32619 4105.25591 3307.84183 4105.30809 3307.34537 4105.29067 3306.84649 4105.20399 3306.35489 4105.04973 3305.88013 4104.8309 3305.43146 4104.55176 3305.01762 4104.21774 3304.64665 4103.83534 3304.32578 4103.412 3304.06125 4102.95597 3303.85821 4102.47612 3303.72062 4101.98179 3303.65114 4101.79142 3303.62069 4101.66165 3303.53399 4100.28273 3302.15506 4100.0237 3301.94249 4099.74559 3301.79383 4099.44383 3301.70229 4099.11035 3301.66945 4088.51965 3301.66945 4088.18617 3301.70229 4087.88441 3301.79383 4087.6063 3301.94249 4087.34756 3302.15483 4085.67081 3303.83767 4085.54109 3303.92466 4085.38794 3303.95534 4085.23472 3303.92503 4085.10478 3303.83835 4085.01795 3303.70852 4084.98746 3303.55533 4084.98755 3298.44489 4085.01475 3298.29991 4085.09264 3298.17465 4085.21064 3298.08614 4085.35269 3298.04641 4085.49723 3298.03377 4085.87076 3297.93368 4086.22124 3297.77025 4086.53801 3297.54845 4086.81145 3297.27501 4087.03325 3296.95824 4087.19668 3296.60776 4087.29677 3296.23423 4087.33047 3295.849 4087.29677 3295.46377 4087.19668 3295.09024 4087.03325 3294.73976 4086.81145 3294.42299 4086.53801 3294.14955 4086.22124 3293.92775 4085.87076 3293.76432 4085.49723 3293.66423 4085.112 3293.63053 4084.72677 3293.66423 4084.35324 3293.76432 4084.03105 3293.91456 4083.862 3293.95203 4083.69295 3293.91456 4083.37076 3293.76432 4082.99723 3293.66423 4082.612 3293.63053 4082.22677 3293.66423 4081.85324 3293.76432 4081.50276 3293.92775 4081.18599 3294.14955 4080.91255 3294.42299 4080.69075 3294.73976 4080.52732 3295.09024 4080.42723 3295.46377 4080.41189 3295.6391 4080.38316 3295.75684 4080.32049 3295.86056 4080.18135 3296.02725 4080.05188 3296.12933 4079.89224 3296.17052 4079.72954 3296.14382 4079.59143 3296.05377 4071.76273 3288.22506 4071.5037 3288.01249 4071.22559 3287.86383 4070.92383 3287.77229 4070.59035 3287.73945 3963.62965 3287.73945 3963.29617 3287.77229 3962.99441 3287.86383 3962.7163 3288.01249 3962.45727 3288.22506 3938.95559 3311.72675 3938.87735 3311.78762 3938.78655 3311.82738 3938.53177 3311.903 3938.02023 3312.12944 3937.54185 3312.41943 3937.10449 3312.76822 3936.71531 3313.17008 3936.38072 3313.6184 3936.10621 3314.10583 3936.00613 3314.27078 3935.87584 3314.35859 3935.72178 3314.38945 3934.35076 3314.38945 3934.20462 3314.3618 3934.07869 3314.28267 3933.99037 3314.163 3933.84335 3313.85771 3933.53817 3313.38887 3933.17554 3312.96291 3932.76142 3312.58682 3932.30261 3312.26677 3931.80663 3312.00802 3931.28164 3311.81481 3930.73625 3311.69033 3930.17943 3311.63662 3929.6203 3311.65455 3929.06806 3311.74383 3928.53177 3311.903 3928.02023 3312.12944 3927.54185 3312.41943 3927.10449 3312.76822 3926.71531 3313.17008 3926.38072 3313.6184 3926.10621 3314.10583 3925.89628 3314.62436 3925.75438 3315.16547 3925.68284 3315.72029 3925.68284 3316.27971 3925.75438 3316.83453 3925.89628 3317.37564 3926.10621 3317.89417 3926.38072 3318.3816 3926.71531 3318.82992 3927.10449 3319.23178 3927.54185 3319.58057 3928.02023 3319.87056 3928.53177 3320.097 3929.06806 3320.25617 3929.6203 3320.34545 3930.17943 3320.36338 3930.73625 3320.30967 3931.28164 3320.18519 3931.80663 3319.99198 3932.30261 3319.73323 3932.76142 3319.41318 3933.17554 3319.03709 3933.53817 3318.61113 3933.84335 3318.14229 3933.99037 3317.837 3934.07869 3317.71733 3934.20462 3317.6382 3934.35076 3317.61055 3935.72178 3317.61055 3935.87584 3317.64141 3936.00613 3317.72922 3936.10621 3317.89417 3936.38072 3318.3816 3936.71531 3318.82992 3937.10449 3319.23178 3937.54185 3319.58057 3938.02023 3319.87056 3938.53177 3320.097 3939.06806 3320.25617 3939.6203 3320.34545 3940.17943 3320.36338 3940.73625 3320.30967 3941.28164 3320.18519 3941.80663 3319.99198 3942.30261 3319.73323 3942.76142 3319.41318 3943.17554 3319.03709 3943.53817 3318.61113 3943.84335 3318.14229 3944.08607 3317.63828 3944.26235 3317.10736 3944.36928 3316.55826 3944.40513 3316 3944.36928 3315.44174 3944.26235 3314.89264 3944.08607 3314.36172 3943.84335 3313.85771 3943.53817 3313.38887 3943.46047 3313.29759 3943.38696 3313.1689 3943.36537 3313.02228 3943.39863 3312.87786 3943.4822 3312.75546 3964.65995 3291.57771 3964.78972 3291.491 3964.9428 3291.46055 4069.2772 3291.46055 4069.43028 3291.491 4069.56005 3291.57771 4075.14159 3297.15925 4075.22537 3297.28213 4075.25846 3297.42713 4075.23771 3297.56482 4075.35763 3297.54097 4075.5107 3297.57142 4075.64047 3297.65813 4075.74229 3297.75995 4075.829 3297.88972 4075.85945 3298.0428 4075.85945 3298.39633 4075.82776 3298.55236 4075.73772 3298.68367 4075.60359 3298.76945 4075.44663 3298.79612 4075.2917 3298.75945 4075.16334 3298.66525 4075.0819 3298.52844 4074.97326 3298.27571 4074.95763 3298.16497 4074.95763 3297.94097 4074.98265 3297.81517 4074.90353 3297.83957 4074.51885 3297.89878 4074.35176 3297.86409 4074.10289 3297.83605 4072.96671 3297.83605 4072.71784 3297.86409 4072.55035 3297.89892 4072.38286 3297.86409 4072.13399 3297.83605 4070.99781 3297.83605 4070.74894 3297.86409 4070.58185 3297.89878 4070.41476 3297.86409 4070.14307 3297.83605 4070.14307 3298.16497 4070.12744 3298.27571 4070.05864 3298.41459 4069.97495 3298.65376 4069.89062 3298.79371 4069.75736 3298.88827 4069.5974 3298.92164 4069.43744 3298.88827 4069.30418 3298.79371 4069.21985 3298.65376 4069.13616 3298.41459 4069.06816 3298.27698 4069.05253 3298.16625 4069.05253 3297.83605 4068.78084 3297.86409 4068.61335 3297.89892 4068.44586 3297.86409 4068.19699 3297.83605 4067.06081 3297.83605 4066.81194 3297.86409 4066.64485 3297.89878 4066.47776 3297.86409 4066.22889 3297.83605 4065.09271 3297.83605 4064.84384 3297.86409 4064.67635 3297.89892 4064.50886 3297.86409 4064.25999 3297.83605 4063.12381 3297.83605 4062.87494 3297.86409 4062.70785 3297.89878 4062.54076 3297.86409 4062.29189 3297.83605 4061.15571 3297.83605 4060.90684 3297.86409 4060.73935 3297.89892 4060.57186 3297.86409 4060.32299 3297.83605 4059.18681 3297.83605 4058.93794 3297.86409 4058.77085 3297.89878 4058.60376 3297.86409 4058.35489 3297.83605 4057.21871 3297.83605 4056.96984 3297.86409 4056.8023 3297.89894 4056.63476 3297.86409 4056.38589 3297.83605 4055.24971 3297.83605 4055.00084 3297.86409 4054.8338 3297.89876 4054.66676 3297.86409 4054.41789 3297.83605 4053.28171 3297.83605 4053.03284 3297.86409 4052.8653 3297.89894 4052.69776 3297.86409 4052.44889 3297.83605 4051.83 3297.83605 4051.67693 3297.8056 4051.54716 3297.71889 4051.46045 3297.58912 4051.43 3297.37965 4051.3989 3297.06384 4051.31251 3296.77906 4051.17222 3296.51661 4050.97091 3296.2713 4048.4287 3293.72909 4048.18339 3293.52778 4047.92094 3293.38749 4047.63616 3293.3011 4047.32035 3293.27 4043.41965 3293.27 4043.10384 3293.3011 4042.81906 3293.38749 4042.55661 3293.52778 4042.3113 3293.72909 4039.73755 3296.30284 4039.60778 3296.38955 4039.45471 3296.42 3998.03965 3296.42 3997.72384 3296.4511 3997.43906 3296.53749 3997.17661 3296.67778 3996.9313 3296.87909 3989.23755 3304.57284 3989.10778 3304.65955 3988.95471 3304.69 3968.76965 3304.69 3968.45384 3304.7211 3968.16906 3304.80749 3967.90661 3304.94778 3967.6613 3305.14909 3961.20506 3311.60533 3961.09577 3311.68288 3960.967 3311.71998 3960.83321 3311.71246 3960.73625 3311.69033 3960.17943 3311.63662 3959.6203 3311.65455 3959.06806 3311.74383 3958.53177 3311.903 3958.02023 3312.12944 3957.54185 3312.41943 3957.10449 3312.76822 3956.71531 3313.17008 3956.38072 3313.6184 3956.10621 3314.10583 3955.89628 3314.62436 3955.75438 3315.16547 3955.68284 3315.72029 3955.68284 3316.27971 3955.75438 3316.83453 3955.89628 3317.37564 3956.10621 3317.89417 3956.38072 3318.3816 3956.71531 3318.82992 3957.10449 3319.23178 3957.54185 3319.58057 3958.02023 3319.87056 3958.53177 3320.097 3959.06806 3320.25617 3959.6203 3320.34545 3960.17943 3320.36338 3960.73625 3320.30967 3961.28164 3320.18519 3961.80663 3319.99198 3962.30261 3319.73323 3962.76142 3319.41318 3962.92108 3319.26819 3963.05185 3319.18891 3963.20282 3319.16451 3963.35191 3319.19853 3963.47734 3319.28603 3963.56077 3319.41419 3963.59 3319.5643 3963.59 3320.82035 3963.6211 3321.13616 3963.70749 3321.42094 3963.84778 3321.68339 3964.04896 3321.92854 3965.95427 3323.82999 3966.04075 3323.95881 3966.07171 3324.11084 3966.04248 3324.26322 3965.89628 3324.62436 3965.75438 3325.16547 3965.68284 3325.72029 3965.68284 3326.27971 3965.75438 3326.83453 3965.89628 3327.37564 3966.10621 3327.89417 3966.38072 3328.3816 3966.71531 3328.82992 3967.10449 3329.23178 3967.55402 3329.58794 3967.67836 3329.70644 3967.74154 3329.86616 3967.73191 3330.03765 3967.65124 3330.18929 3967.51442 3330.29312 3967.34666 3330.33 3963.40529 3330.33 3963.25222 3330.29955 3963.12245 3330.21284 3962.82833 3329.91873 3962.73981 3329.78451 3962.71129 3329.62627 3962.74738 3329.46959 3962.84226 3329.33977 3963.17554 3329.03709 3963.53817 3328.61113 3963.84335 3328.14229 3964.08607 3327.63828 3964.26235 3327.10736 3964.36928 3326.55826 3964.40513 3326 3964.36928 3325.44174 3964.26235 3324.89264 3964.08607 3324.36172 3963.84335 3323.85771 3963.53817 3323.38887 3963.17554 3322.96291 3962.76142 3322.58682 3962.30261 3322.26677 3961.80663 3322.00802 3961.28164 3321.81481 3960.73625 3321.69033 3960.17943 3321.63662 3959.6203 3321.65455 3959.06806 3321.74383 3958.53177 3321.903 3958.02023 3322.12944 3957.54185 3322.41943 3957.2794 3322.62874 3957.1479 3322.69823 3957.00011 3322.71489 3956.85645 3322.67639 3956.73678 3322.58807 3956.65765 3322.46214 3956.63 3322.316 3956.63 3321.08965 3956.5989 3320.77384 3956.51251 3320.48906 3956.37222 3320.22661 3956.17091 3319.9813 3954.19629 3318.00669 3954.11337 3317.88576 3954.0796 3317.74307 3954.09951 3317.5978 3954.26235 3317.10736 3954.36928 3316.55826 3954.40513 3316 3954.36928 3315.44174 3954.26235 3314.89264 3954.08607 3314.36172 3953.84335 3313.85771 3953.53817 3313.38887 3953.17554 3312.96291 3952.76142 3312.58682 3952.30261 3312.26677 3951.80663 3312.00802 3951.28164 3311.81481 3950.73625 3311.69033 3950.17943 3311.63662 3949.6203 3311.65455 3949.06806 3311.74383 3948.53177 3311.903 3948.02023 3312.12944 3947.54185 3312.41943 3947.10449 3312.76822 3946.71531 3313.17008 3946.38072 3313.6184 3946.10621 3314.10583 3945.89628 3314.62436 3945.75438 3315.16547 3945.68284 3315.72029 3945.68284 3316.27971 3945.75438 3316.83453 3945.89628 3317.37564 3946.10621 3317.89417 3946.38072 3318.3816 3946.71531 3318.82992 3947.10449 3319.23178 3947.54185 3319.58057 3948.02023 3319.87056 3948.53177 3320.097 3949.06806 3320.25617 3949.6203 3320.34545 3950.17943 3320.36338 3950.73625 3320.30967 3951.28164 3320.18519 3951.62191 3320.05996 3951.77074 3320.03549 3951.91806 3320.06788 3952.0429 3320.15251 3953.47284 3321.58245 3953.55955 3321.71222 3953.59 3321.86529 3953.59 3322.4357 3953.56077 3322.58581 3953.47734 3322.71397 3953.35191 3322.80147 3953.20282 3322.83549 3953.05185 3322.81109 3952.92108 3322.73181 3952.76142 3322.58682 3952.30261 3322.26677 3951.80663 3322.00802 3951.28164 3321.81481 3950.73625 3321.69033 3950.17943 3321.63662 3949.6203 3321.65455 3949.06806 3321.74383 3948.53177 3321.903 3948.02023 3322.12944 3947.54185 3322.41943 3947.10449 3322.76822 3946.71531 3323.17008 3946.38072 3323.6184 3946.10621 3324.10583 3945.89628 3324.62436 3945.75438 3325.16547 3945.68284 3325.72029 3945.68284 3326.27971 3945.75438 3326.83453 3945.89628 3327.37564 3946.10621 3327.89417 3946.38072 3328.3816 3946.71531 3328.82992 3947.10449 3329.23178 3947.54185 3329.58057 3948.02023 3329.87056 3948.53177 3330.097 3949.06806 3330.25617 3949.6203 3330.34545 3950.17943 3330.36338 3950.26006 3330.3556 3950.4336 3330.37727 3950.58131 3330.47091 3958.0213 3337.91091 3958.26661 3338.11222 3958.52906 3338.25251 3958.81384 3338.3389 Z M 3901.78 3302.24377 L 3902.4231 3302.20765 3903.05811 3302.09976 3903.67705 3301.92145 3904.27213 3301.67496 3904.83587 3301.36339 3905.36118 3300.99066 3905.84146 3300.56146 3906.27066 3300.08118 3906.64339 3299.55587 3906.95496 3298.99213 3907.20145 3298.39705 3907.37976 3297.77811 3907.48765 3297.1431 3907.52377 3296.5 3907.48765 3295.8569 3907.37976 3295.22189 3907.20145 3294.60295 3906.95496 3294.00787 3906.64339 3293.44413 3906.27066 3292.91882 3905.84146 3292.43854 3905.36118 3292.00934 3904.83587 3291.63661 3904.27213 3291.32504 3903.67705 3291.07855 3903.05811 3290.90024 3902.4231 3290.79235 3901.78 3290.75623 3901.1369 3290.79235 3900.50189 3290.90024 3899.88295 3291.07855 3899.28787 3291.32504 3898.72413 3291.63661 3898.19882 3292.00934 3897.71854 3292.43854 3897.28934 3292.91882 3896.91661 3293.44413 3896.60504 3294.00787 3896.35855 3294.60295 3896.18024 3295.22189 3896.07235 3295.8569 3896.03623 3296.5 3896.07235 3297.1431 3896.18024 3297.77811 3896.35855 3298.39705 3896.60504 3298.99213 3896.91661 3299.55587 3897.28934 3300.08118 3897.71854 3300.56146 3898.19882 3300.99066 3898.72413 3301.36339 3899.28787 3301.67496 3899.88295 3301.92145 3900.50189 3302.09976 3901.1369 3302.20765 3901.78 3302.24377 Z M 3901.78 3351.06277 L 3902.4231 3351.02665 3903.05811 3350.91876 3903.67705 3350.74045 3904.27213 3350.49396 3904.83587 3350.18239 3905.36118 3349.80966 3905.84146 3349.38046 3906.27066 3348.90018 3906.64339 3348.37487 3906.95496 3347.81113 3907.20145 3347.21605 3907.37976 3346.59711 3907.48765 3345.9621 3907.52377 3345.319 3907.48765 3344.6759 3907.37976 3344.04089 3907.20145 3343.42195 3906.95496 3342.82687 3906.64339 3342.26313 3906.27066 3341.73782 3905.84146 3341.25754 3905.36118 3340.82834 3904.83587 3340.45561 3904.27213 3340.14404 3903.67705 3339.89755 3903.05811 3339.71924 3902.4231 3339.61135 3901.78 3339.57523 3901.1369 3339.61135 3900.50189 3339.71924 3899.88295 3339.89755 3899.28787 3340.14404 3898.72413 3340.45561 3898.19882 3340.82834 3897.71854 3341.25754 3897.28934 3341.73782 3896.91661 3342.26313 3896.60504 3342.82687 3896.35855 3343.42195 3896.18024 3344.04089 3896.07235 3344.6759 3896.03623 3345.319 3896.07235 3345.9621 3896.18024 3346.59711 3896.35855 3347.21605 3896.60504 3347.81113 3896.91661 3348.37487 3897.28934 3348.90018 3897.71854 3349.38046 3898.19882 3349.80966 3898.72413 3350.18239 3899.28787 3350.49396 3899.88295 3350.74045 3900.50189 3350.91876 3901.1369 3351.02665 3901.78 3351.06277 Z M 4138 3351.06277 L 4138.6431 3351.02665 4139.27811 3350.91876 4139.89705 3350.74045 4140.49213 3350.49396 4141.05587 3350.18239 4141.58118 3349.80966 4142.06146 3349.38046 4142.49066 3348.90018 4142.86339 3348.37487 4143.17496 3347.81113 4143.42145 3347.21605 4143.59976 3346.59711 4143.70765 3345.9621 4143.74377 3345.319 4143.70765 3344.6759 4143.59976 3344.04089 4143.42145 3343.42195 4143.17496 3342.82687 4142.86339 3342.26313 4142.49066 3341.73782 4142.06146 3341.25754 4141.58118 3340.82834 4141.05587 3340.45561 4140.49213 3340.14404 4139.89705 3339.89755 4139.27811 3339.71924 4138.6431 3339.61135 4138 3339.57523 4137.3569 3339.61135 4136.72189 3339.71924 4136.10295 3339.89755 4135.50787 3340.14404 4134.94413 3340.45561 4134.41882 3340.82834 4133.93854 3341.25754 4133.50934 3341.73782 4133.13661 3342.26313 4132.82504 3342.82687 4132.57855 3343.42195 4132.40024 3344.04089 4132.29235 3344.6759 4132.25623 3345.319 4132.29235 3345.9621 4132.40024 3346.59711 4132.57855 3347.21605 4132.82504 3347.81113 4133.13661 3348.37487 4133.50934 3348.90018 4133.93854 3349.38046 4134.41882 3349.80966 4134.94413 3350.18239 4135.50787 3350.49396 4136.10295 3350.74045 4136.72189 3350.91876 4137.3569 3351.02665 4138 3351.06277 Z M 4138 3302.24377 L 4138.6431 3302.20765 4139.27811 3302.09976 4139.89705 3301.92145 4140.49213 3301.67496 4141.05587 3301.36339 4141.58118 3300.99066 4142.06146 3300.56146 4142.49066 3300.08118 4142.86339 3299.55587 4143.17496 3298.99213 4143.42145 3298.39705 4143.59976 3297.77811 4143.70765 3297.1431 4143.74377 3296.5 4143.70765 3295.8569 4143.59976 3295.22189 4143.42145 3294.60295 4143.17496 3294.00787 4142.86339 3293.44413 4142.49066 3292.91882 4142.06146 3292.43854 4141.58118 3292.00934 4141.05587 3291.63661 4140.49213 3291.32504 4139.89705 3291.07855 4139.27811 3290.90024 4138.6431 3290.79235 4138 3290.75623 4137.3569 3290.79235 4136.72189 3290.90024 4136.10295 3291.07855 4135.50787 3291.32504 4134.94413 3291.63661 4134.41882 3292.00934 4133.93854 3292.43854 4133.50934 3292.91882 4133.13661 3293.44413 4132.82504 3294.00787 4132.57855 3294.60295 4132.40024 3295.22189 4132.29235 3295.8569 4132.25623 3296.5 4132.29235 3297.1431 4132.40024 3297.77811 4132.57855 3298.39705 4132.82504 3298.99213 4133.13661 3299.55587 4133.50934 3300.08118 4133.93854 3300.56146 4134.41882 3300.99066 4134.94413 3301.36339 4135.50787 3301.67496 4136.10295 3301.92145 4136.72189 3302.09976 4137.3569 3302.20765 4138 3302.24377 Z M 3933.36349 3330.36645 L 3933.61236 3330.33841 3933.82741 3330.26316 3934.02033 3330.14194 3934.18144 3329.98083 3934.30266 3329.78791 3934.37791 3329.57286 3934.40595 3329.32399 3934.40595 3322.67601 3934.37791 3322.42714 3934.30266 3322.21209 3934.18144 3322.01917 3934.02033 3321.85806 3933.82741 3321.73684 3933.61236 3321.66159 3933.36349 3321.63355 3926.71551 3321.63355 3926.46664 3321.66159 3926.25159 3321.73684 3926.05867 3321.85806 3925.89756 3322.01917 3925.77634 3322.21209 3925.70109 3322.42714 3925.67305 3322.67601 3925.67305 3329.32399 3925.70109 3329.57286 3925.77634 3329.78791 3925.89756 3329.98083 3926.05867 3330.14194 3926.25159 3330.26316 3926.46664 3330.33841 3926.71551 3330.36645 3933.36349 3330.36645 Z M 3940.17943 3330.36338 L 3940.73625 3330.30967 3941.28164 3330.18519 3941.80663 3329.99198 3942.30261 3329.73323 3942.76142 3329.41318 3943.17554 3329.03709 3943.53817 3328.61113 3943.84335 3328.14229 3944.08607 3327.63828 3944.26235 3327.10736 3944.36928 3326.55826 3944.40513 3326 3944.36928 3325.44174 3944.26235 3324.89264 3944.08607 3324.36172 3943.84335 3323.85771 3943.53817 3323.38887 3943.17554 3322.96291 3942.76142 3322.58682 3942.30261 3322.26677 3941.80663 3322.00802 3941.28164 3321.81481 3940.73625 3321.69033 3940.17943 3321.63662 3939.6203 3321.65455 3939.06806 3321.74383 3938.53177 3321.903 3938.02023 3322.12944 3937.54185 3322.41943 3937.10449 3322.76822 3936.71531 3323.17008 3936.38072 3323.6184 3936.10621 3324.10583 3935.89628 3324.62436 3935.75438 3325.16547 3935.68284 3325.72029 3935.68284 3326.27971 3935.75438 3326.83453 3935.89628 3327.37564 3936.10621 3327.89417 3936.38072 3328.3816 3936.71531 3328.82992 3937.10449 3329.23178 3937.54185 3329.58057 3938.02023 3329.87056 3938.53177 3330.097 3939.06806 3330.25617 3939.6203 3330.34545 3940.17943 3330.36338 Z M 4122.67117 3327.22404 L 4122.76291 3327.18276 4123.25476 3326.88542 4123.70718 3326.53098 4124.11358 3326.12458 4124.46802 3325.67216 4124.76536 3325.18031 4125.00123 3324.65621 4125.1728 3324.10432 4122.67117 3324.10432 4122.67117 3327.22404 Z M 4115.92998 3317.8925 L 4115.9294 3317.89567 4118.43102 3317.89567 4118.43102 3314.77596 4118.33929 3314.81724 4117.84744 3315.11458 4117.39502 3315.46902 4116.98862 3315.87542 4116.63418 3316.32784 4116.33684 3316.81969 4116.10097 3317.34379 4115.92998 3317.8925 Z M 4125.1728 3317.89567 L 4125.00123 3317.34379 4124.76536 3316.81969 4124.46802 3316.32784 4124.11358 3315.87542 4123.70718 3315.46902 4123.25476 3315.11458 4122.76291 3314.81724 4122.67117 3314.77596 4122.67117 3317.89567 4125.1728 3317.89567 Z M 4118.33929 3327.18276 L 4118.43102 3327.22404 4118.43102 3324.10432 4115.9294 3324.10432 4116.10097 3324.65621 4116.33684 3325.18031 4116.63418 3325.67216 4116.98862 3326.12458 4117.39502 3326.53098 4117.84744 3326.88542 4118.33929 3327.18276 Z M 4100.99007 3351.4878 L 4100.99007 3348.98618 4097.87036 3348.98618 4097.91164 3349.07791 4098.20898 3349.56976 4098.56342 3350.02218 4098.96982 3350.42858 4099.42224 3350.78302 4099.91409 3351.08036 4100.43819 3351.31623 4100.99007 3351.4878 Z M 4107.19867 3290.5122 L 4107.19867 3293.01382 4110.31839 3293.01382 4110.27711 3292.92209 4109.97977 3292.43024 4109.62533 3291.97782 4109.21893 3291.57142 4108.76651 3291.21698 4108.27466 3290.91964 4107.75056 3290.68377 4107.19867 3290.5122 Z M 4100.99002 3299.7556 L 4100.99002 3297.25398 4097.87031 3297.25398 4097.91159 3297.34571 4098.20893 3297.83756 4098.56337 3298.28998 4098.96977 3298.69638 4099.42219 3299.05082 4099.91404 3299.34816 4100.43814 3299.58403 4100.99002 3299.7556 Z M 4110.31844 3344.74602 L 4110.27716 3344.65429 4109.97982 3344.16244 4109.62538 3343.71002 4109.21898 3343.30362 4108.76656 3342.94918 4108.27471 3342.65184 4107.75061 3342.41597 4107.19873 3342.2444 4107.19873 3344.74602 4110.31844 3344.74602 Z M 4097.91164 3344.65429 L 4097.87036 3344.74602 4100.99007 3344.74602 4100.99007 3342.2444 4100.43819 3342.41597 4099.91409 3342.65184 4099.42224 3342.94918 4098.96982 3343.30362 4098.56342 3343.71002 4098.20898 3344.16244 4097.91164 3344.65429 Z M 4107.19867 3297.25398 L 4107.19867 3299.7556 4107.75056 3299.58403 4108.27466 3299.34816 4108.76651 3299.05082 4109.21893 3298.69638 4109.62533 3298.28998 4109.97977 3297.83756 4110.27711 3297.34571 4110.31839 3297.25398 4107.19867 3297.25398 Z M 4107.19873 3348.98618 L 4107.19873 3351.4878 4107.75061 3351.31623 4108.27471 3351.08036 4108.76656 3350.78302 4109.21898 3350.42858 4109.62538 3350.02218 4109.97982 3349.56976 4110.27716 3349.07791 4110.31844 3348.98618 4107.19873 3348.98618 Z M 4097.91159 3292.92209 L 4097.87031 3293.01382 4100.99002 3293.01382 4100.99002 3290.5122 4100.43814 3290.68377 4099.91404 3290.91964 4099.42219 3291.21698 4098.96977 3291.57142 4098.56337 3291.97782 4098.20893 3292.43024 4097.91159 3292.92209 Z M 4103.26173 3331.55022 L 4103.26173 3333.24998 4104.96391 3333.24998 4104.94815 3333.21098 4104.69856 3332.77867 4104.39123 3332.3853 4104.03214 3332.03854 4103.62829 3331.74512 4103.26173 3331.55022 Z M 4100.20268 3333.24998 L 4100.20268 3331.55022 4099.83611 3331.74512 4099.43226 3332.03854 4099.07317 3332.3853 4098.76584 3332.77867 4098.51625 3333.21098 4098.50049 3333.24998 4100.20268 3333.24998 Z M 4100.0524 3337.93875 L 4100.20268 3338.00566 4100.20268 3336.30903 4098.50693 3336.30903 4098.6335 3336.56854 4098.91264 3336.98238 4099.24666 3337.35335 4099.62906 3337.67422 4100.0524 3337.93875 Z M 4103.26173 3336.30903 L 4103.26173 3338.00566 4103.412 3337.93875 4103.83534 3337.67422 4104.21774 3337.35335 4104.55176 3336.98238 4104.8309 3336.56854 4104.95747 3336.30903 4103.26173 3336.30903 Z "}]},"pads":[],"nets":["RX0","TX0","SDA","SCL","+3.3V","GND","+5V","USB_N","USB_P","PWM0","PWM1","GPIO4","GPIO3","GPIO5","GPIO2","GPIO1","GPIO0"],"bom":{"both":[[1,"THD0515-20CL-SN","FPC-SMD_20P-P0.50_THD0515-20CL-SN",[["TPNL",0]],["THD","THD0515-20CL-SN","LCSC","C283149"]],[1,"1.0T-4PLTPZ","FPC-SMD_4P-P1.00_1.0T-4PLTPZ",[["QWIIC",1]],["BOOMELE(博穆精密)","1.0T-4PLTPZ","LCSC","C2974722"]],[1,"HDGC1002WV-S-3P","CONN-SMD_3P-P1.00_HDGC_HDGC1002WV-S-3P",[["UART",2]],["HDGC(华德共创)","HDGC1002WV-S-3P","LCSC","C2936216"]],[1,"210S-2*6P L=11.6MMGold-plated black","HDR-TH_12P-P2.54-V-M-R2-C6-S2.54",[["GPIO",3]],["Ckmtw","210S-2*6P L=11.6MMGold-plated black","LCSC","C124388"]],[1,"USB-A  Vertical 10.5mm","USB-TH_1050570001",[["USB",4]],["Molex","1050570001","LCSC","C586225"]],[1,"Header-Male-2.54_2x3","HDR-TH_6P-P2.54-V-M-R2-C3-S2.54-1",[["SERVO",5]],["BOOMELE","Header-Male-2.54_2x3","LCSC","C65114"]]],"F":[[1,"1.0T-4PLTPZ","FPC-SMD_4P-P1.00_1.0T-4PLTPZ",[["QWIIC",1]],["BOOMELE(博穆精密)","1.0T-4PLTPZ","LCSC","C2974722"]],[1,"HDGC1002WV-S-3P","CONN-SMD_3P-P1.00_HDGC_HDGC1002WV-S-3P",[["UART",2]],["HDGC(华德共创)","HDGC1002WV-S-3P","LCSC","C2936216"]],[1,"210S-2*6P L=11.6MMGold-plated black","HDR-TH_12P-P2.54-V-M-R2-C6-S2.54",[["GPIO",3]],["Ckmtw","210S-2*6P L=11.6MMGold-plated black","LCSC","C124388"]],[1,"USB-A  Vertical 10.5mm","USB-TH_1050570001",[["USB",4]],["Molex","1050570001","LCSC","C586225"]],[1,"Header-Male-2.54_2x3","HDR-TH_6P-P2.54-V-M-R2-C3-S2.54-1",[["SERVO",5]],["BOOMELE","Header-Male-2.54_2x3","LCSC","C65114"]]],"B":[[1,"THD0515-20CL-SN","FPC-SMD_20P-P0.50_THD0515-20CL-SN",[["TPNL",0]],["THD","THD0515-20CL-SN","LCSC","C283149"]]],"skipped":[],"customColumns":["BOM_Manufacturer","BOM_Manufacturer Part","BOM_Supplier","BOM_Supplier Part"]}};
///////////////////////////////////////////////

///////////////////////////////////////////////
/* Utility functions */

var storagePrefix = 'ibom__' + pcbdata.metadata.title + '__' +
  pcbdata.metadata.revision + '__#';

function buildKeyForLocalStorageDict() {  
  return storagePrefix;
}

var storage;
var _isLocalStorageUsed = false;

function initStorage(key) {
  try {
    window.localStorage.getItem("blank");
    storage = window.localStorage;    
    _isLocalStorageUsed = true;
  } catch (e) {
    // localStorage not available
  }
  if (!storage) {
    try {
      window.sessionStorage.getItem("blank");
      storage = window.sessionStorage;      
    } catch (e) {
      // sessionStorage also not available
    }
  }
}



function readStorage(key) {
  if(!storage) {
    return null;
  }

  if(!_isLocalStorageUsed) {    
    return storage.getItem(storagePrefix + key);
  }

  try {
    var dictKey = buildKeyForLocalStorageDict();
    var obj = JSON.parse(storage.getItem(dictKey));    
    if(!obj || !obj.hasOwnProperty(key)) {
      return null;
    }

    return JSON.parse(storage.getItem(dictKey))[key];
  } catch(e) {
    console.log('[ibom]: Unable to obtain a value from local storage!');
    console.log(e);
  }
  
  // Original implementation
  // return storage.getItem(storagePrefix + key);
}


function writeStorage(key, value) {
  if(!storage) {
    return;
  }

  if(!_isLocalStorageUsed) {
    storage.setItem(storagePrefix + key, value);
    return;
  }

  try {
    var dictKey = buildKeyForLocalStorageDict();
    if(!storage.getItem(dictKey)) {
      storage.setItem(dictKey,JSON.stringify({
        _storagePrefix: storagePrefix
      }));
    }

    var obj = JSON.parse(storage.getItem(dictKey));
    obj[key] = value;
    storage.setItem(dictKey,JSON.stringify(obj));            
  } catch(e) {
    console.log('[ibom]: Unable to write key to local storage!');
    console.log(e);
  }
  
  // Original implementation
  // storage.setItem(storagePrefix + key, value);
}

function fancyDblClickHandler(el, onsingle, ondouble) {
  return function() {
    if (el.getAttribute("data-dblclick") == null) {
      el.setAttribute("data-dblclick", 1);
      setTimeout(function() {
        if (el.getAttribute("data-dblclick") == 1) {
          onsingle();
        }
        el.removeAttribute("data-dblclick");
      }, 200);
    } else {
      el.removeAttribute("data-dblclick");
      ondouble();
    }
  }
}

function smoothScrollToRow(rowid) {
  document.getElementById(rowid).scrollIntoView({
    behavior: "smooth",
    block: "center",
    inline: "nearest"
  });
}

function focusInputField(input) {
  input.scrollIntoView(false);
  input.focus();
  input.select();
}

function copyToClipboard() {
  var text = '';
  for (var node of bomhead.childNodes[0].childNodes) {
    if (node.firstChild) {
      text = text + node.firstChild.nodeValue;
    }
    if (node != bomhead.childNodes[0].lastChild) {
      text += '\t';
    }
  }
  text += '\n';
  for (var row of bombody.childNodes) {
    for (var cell of row.childNodes) {
      for (var node of cell.childNodes) {
        if (node.nodeName == "INPUT") {
          if (node.checked) {
            text = text + '✓';
          }
        } else if (node.nodeName == "MARK") {
          text = text + node.firstChild.nodeValue;
        } else {
          text = text + node.nodeValue;
        }
      }
      if (cell != row.lastChild) {
        text += '\t';
      }
    }
    text += '\n';
  }
  var textArea = document.createElement("textarea");
  textArea.classList.add('clipboard-temp');
  textArea.value = text;

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    if (document.execCommand('copy')) {
      console.log('Bom copied to clipboard.');
    }
  } catch (err) {
    console.log('Can not copy to clipboard.');
  }

  document.body.removeChild(textArea);
}

function removeGutterNode(node) {
  for (var i = 0; i < node.childNodes.length; i++) {
    if (node.childNodes[i].classList &&
      node.childNodes[i].classList.contains("gutter")) {
      node.removeChild(node.childNodes[i]);
      break;
    }
  }
}

function cleanGutters() {
  removeGutterNode(document.getElementById("bot"));
  removeGutterNode(document.getElementById("canvasdiv"));
}

var units = {
  prefixes: {
    giga: ["G", "g", "giga", "Giga", "GIGA"],
    mega: ["M", "mega", "Mega", "MEGA"],
    kilo: ["K", "k", "kilo", "Kilo", "KILO"],
    milli: ["m", "milli", "Milli", "MILLI"],
    micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
    nano: ["N", "n", "nano", "Nano", "NANO"],
    pico: ["P", "p", "pico", "Pico", "PICO"],
  },
  unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
  unitsLong: [
    "OHM", "Ohm", "ohm", "ohms",
    "FARAD", "Farad", "farad",
    "HENRY", "Henry", "henry"
  ],
  getMultiplier: function(s) {
    if (this.prefixes.giga.includes(s)) return 1e9;
    if (this.prefixes.mega.includes(s)) return 1e6;
    if (this.prefixes.kilo.includes(s)) return 1e3;
    if (this.prefixes.milli.includes(s)) return 1e-3;
    if (this.prefixes.micro.includes(s)) return 1e-6;
    if (this.prefixes.nano.includes(s)) return 1e-9;
    if (this.prefixes.pico.includes(s)) return 1e-12;
    return 1;
  },
  valueRegex: null,
}

function initUtils() {
  var allPrefixes = units.prefixes.giga
                    .concat(units.prefixes.mega)
                    .concat(units.prefixes.kilo)
                    .concat(units.prefixes.milli)
                    .concat(units.prefixes.micro)
                    .concat(units.prefixes.nano)
                    .concat(units.prefixes.pico);
  var allUnits = units.unitsShort.concat(units.unitsLong);
  units.valueRegex = new RegExp("^([0-9\.]+)" +
                         "\\s*(" + allPrefixes.join("|") + ")?" +
                         "(" + allUnits.join("|") + ")?" +
                         "(\\b.*)?$", "");
  units.valueAltRegex = new RegExp("^([0-9]*)" +
                         "(" + units.unitsShort.join("|") + ")?" +
                         "([GgMmKkUuNnPp])?" +
                         "([0-9]*)" +
                         "(\\b.*)?$", "");
  for (var bom_type of ["both", "F", "B"]) {
    for (var row of pcbdata.bom[bom_type]) {
      row.push(parseValue(row[1], row[3][0][0]));
    }
  }
}

function parseValue(val, ref) {
  var inferUnit = (unit, ref) => {
    if (unit) {
      unit = unit.toLowerCase();
      if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
        unit = 'r';
      }
      unit = unit[0];
    } else {
      ref = /^([a-z]+)\d+$/i.exec(ref);
      if (ref) {
        ref = ref[1].toLowerCase();
        if (ref == "c") unit = 'f';
        else if (ref == "l") unit = 'h';
        else if (ref == "r" || ref == "rv") unit = 'r';
        else unit = null;
      }
    }
    return unit;
  };
  val = val.replace(/,/g, "");
  var match = units.valueRegex.exec(val);
  var unit;
  if (match) {
    val = parseFloat(match[1]);
    if (match[2]) {
      val = val * units.getMultiplier(match[2]);
    }
    unit = inferUnit(match[3], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[4],
    }
  }
  match = units.valueAltRegex.exec(val);
  if (match && (match[1] || match[4])) {
    val = parseFloat(match[1] + "." + match[4]);
    if (match[3]) {
      val = val * units.getMultiplier(match[3]);
    }
    unit = inferUnit(match[2], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[5],
    }
  }
  return null;
}

function valueCompare(a, b, stra, strb) {
  if (a === null && b === null) {
    // Failed to parse both values, compare them as strings.
    if (stra != strb) return stra > strb ? 1 : -1;
    else return 0;
  } else if (a === null) {
    return 1;
  } else if (b === null) {
    return -1;
  } else {
    if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
    else if (a.val != b.val) return a.val > b.val ? 1 : -1;
    else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
    else return 0;
  }
}

function validateSaveImgDimension(element) {
  var valid = false;
  var intValue = 0;
  if (/^[1-9]\d*$/.test(element.value)) {
    intValue = parseInt(element.value);
    if (intValue <= 16000) {
      valid = true;
    }
  }
  if (valid) {
    element.classList.remove("invalid");
  } else {
    element.classList.add("invalid");
  }
  return intValue;
}

function saveImage(layer) {
  var width = validateSaveImgDimension(document.getElementById("render-save-width"));
  var height = validateSaveImgDimension(document.getElementById("render-save-height"));
  var bgcolor = null;
  if (!document.getElementById("render-save-transparent").checked) {
    var style = getComputedStyle(topmostdiv);
    bgcolor = style.getPropertyValue("background-color");
  }
  if (!width || !height) return;

  // Prepare image
  var canvas = document.createElement("canvas");
  var layerdict = {
    transform: {
      x: 0,
      y: 0,
      s: 1,
      panx: 0,
      pany: 0,
      zoom: 1,
    },
    bg: canvas,
    fab: canvas,
    silk: canvas,
    highlight: canvas,
    layer: layer,
  }
  // Do the rendering
  recalcLayerScale(layerdict, width, height);
  prepareLayer(layerdict);
  clearCanvas(canvas, bgcolor);
  drawBackground(layerdict, false);
  drawHighlightsOnLayer(layerdict, false);

  // Save image
  var imgdata = canvas.toDataURL("image/png");

  var filename = pcbdata.metadata.title;
  if (pcbdata.metadata.revision) {
    filename += `.${pcbdata.metadata.revision}`;
  }
  filename += `.${layer}.png`;
  saveFile(filename, dataURLtoBlob(imgdata));
}

function saveSettings() {
  var data = {
    type: "InteractiveHtmlBom settings",
    version: 1,
    pcbmetadata: pcbdata.metadata,
    settings: settings,
  }
  var blob = new Blob([JSON.stringify(data, null, 4)], {type: "application/json"});
  saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}

function loadSettings() {
  var input = document.createElement("input");
  input.type = "file";
  input.accept = ".settings.json";
  input.onchange = function(e) {
    var file = e.target.files[0];
    var reader = new FileReader();
    reader.onload = readerEvent => {
      var content = readerEvent.target.result;
      var newSettings;
      try {
        newSettings = JSON.parse(content);
      } catch(e) {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      if (newSettings.type != "InteractiveHtmlBom settings") {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
      if (metadataMatches) {
        for (var k in pcbdata.metadata) {
          if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
            metadataMatches = false;
          }
        }
      }
      if (!metadataMatches) {
        var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
        var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
        if (!confirm(
          `Settins file metadata does not match current metadata.\n\n` +
          `Page metadata:\n${currentMetadata}\n\n` +
          `Settings file metadata:\n${fileMetadata}\n\n` +
          `Press OK if you would like to import settings anyway.`)) {
          return;
        }
      }
      overwriteSettings(newSettings.settings);
    }
    reader.readAsText(file, 'UTF-8');
  }
  input.click();
}

function overwriteSettings(newSettings) {

  initDone = false;
  Object.assign(settings, newSettings);
  writeStorage("bomlayout", settings.bomlayout);
  writeStorage("bommode", settings.bommode);
  writeStorage("canvaslayout", settings.canvaslayout);
  writeStorage("bomCheckboxes", settings.checkboxes.join(","));
  document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
  for (var checkbox of settings.checkboxes) {
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
  }
  writeStorage("darkenWhenChecked", settings.darkenWhenChecked);
  padsVisible(settings.renderPads);
  document.getElementById("padsCheckbox").checked = settings.renderPads;
  fabricationVisible(settings.renderFabrication);
  document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
  silkscreenVisible(settings.renderSilkscreen);
  document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
  referencesVisible(settings.renderReferences);
  document.getElementById("referencesCheckbox").checked = settings.renderReferences;
  valuesVisible(settings.renderValues);
  document.getElementById("valuesCheckbox").checked = settings.renderValues;
  tracksVisible(settings.renderTracks);
  document.getElementById("tracksCheckbox").checked = settings.renderTracks;
  zonesVisible(settings.renderZones);
  document.getElementById("zonesCheckbox").checked = settings.renderZones;
  dnpOutline(settings.renderDnpOutline);
  document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
  setRedrawOnDrag(settings.redrawOnDrag);
  document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
  setShowCrosshair(settings.showCrosshair);
  document.getElementById("crosshairCheckbox").checked = settings.showCrosshair;
  setDarkMode(settings.darkMode);
  document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
  setHighlightPin1(settings.highlightpin1);
  document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  initDone = true;
  prepCheckboxes();
  changeBomLayout(settings.bomlayout);
}

function saveFile(filename, blob) {
  var link = document.createElement("a");
  var objurl = URL.createObjectURL(blob);
  link.download = filename;
  link.href = objurl;
  link.click();
}

function dataURLtoBlob(dataurl) {
  var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
      bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  while(n--){
      u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], {type:mime});
}

var settings = {
  canvaslayout: "default",
  bomlayout: "default",
  bommode: "grouped",
  checkboxes: [],
  checkboxStoredRefs: {},
  darkMode: false,
  highlightpin1: false,
  redrawOnDrag: true,
  boardRotation: 0,
  renderPads: true,
  renderReferences: true,
  renderValues: true,
  renderSilkscreen: true,
  renderFabrication: true,
  renderDnpOutline: false,
  renderTracks: true,
  renderZones: true,
}

function initDefaults() {
  settings.bomlayout = readStorage("bomlayout");
  if (settings.bomlayout === null) {
    settings.bomlayout = config.bom_view;
  }
  if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
    settings.bomlayout = config.bom_view;
  }
  settings.bommode = readStorage("bommode");
  if (settings.bommode === null) {
    settings.bommode = "grouped";
  }
  if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
    settings.bommode = "grouped";
  }
  settings.canvaslayout = readStorage("canvaslayout");
  if (settings.canvaslayout === null) {
    settings.canvaslayout = config.layer_view;
  }
  var bomCheckboxes = readStorage("bomCheckboxes");
  if (bomCheckboxes === null) {
    bomCheckboxes = config.checkboxes;
  }
  settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
  document.getElementById("bomCheckboxes").value = bomCheckboxes;

  settings.darkenWhenChecked = readStorage("darkenWhenChecked") || "";
  populateDarkenWhenCheckedOptions();

  function initBooleanSetting(storageString, def, elementId, func) {    
    var b = readStorage(storageString);
    if (b === null) {
      b = def;
    } else {
      b = (b === true);
    }
    document.getElementById(elementId).checked = b;
    func(b);
  }

  initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
  initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
  initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
  initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
  initBooleanSetting("valuesVisible", false, "valuesCheckbox", valuesVisible);
  if ("tracks" in pcbdata) {
    initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
    initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
  } else {
    document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
    tracksVisible(false);
    zonesVisible(false);
  }
  initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
  initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
  initBooleanSetting("showCrosshair", config.show_crosshair, "crosshairCheckbox", setShowCrosshair);
  initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
  initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
  settings.boardRotation = readStorage("boardRotation");
  if (settings.boardRotation === null) {
    settings.boardRotation = config.board_rotation * 5;
  } else {
    settings.boardRotation = parseInt(settings.boardRotation);
  }
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
}

// Helper classes for user js callbacks.

const IBOM_EVENT_TYPES = {
  ALL: "all",
  HIGHLIGHT_EVENT: "highlightEvent",
  CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
  BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}

const EventHandler = {
  callbacks: {},
  init: function() {
    for (eventType of Object.values(IBOM_EVENT_TYPES))
      this.callbacks[eventType] = [];
  },
  registerCallback: function(eventType, callback) {
    this.callbacks[eventType].push(callback);
  },
  emitEvent: function(eventType, eventArgs) {
    event = {
      eventType: eventType,
      args: eventArgs,
    }
    var callback;
    for(callback of this.callbacks[eventType])
      callback(event);
    for(callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
      callback(event);
  }
}
EventHandler.init();

///////////////////////////////////////////////

///////////////////////////////////////////////
/* PCB rendering code */

var emptyContext2d = document.createElement("canvas").getContext("2d");
var hitTestContext2d = document.createElement("canvas").getContext("2d");

function deg2rad(deg) {
  return deg * Math.PI / 180;
}

function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
  var point = [
    linepoint[0] * text.width + offsetx,
    linepoint[1] * text.height + offsety
  ];
  // This approximates pcbnew behavior with how text tilts depending on horizontal justification
  point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
  return point;
}

function drawText(ctx, text, color) {
  if ("ref" in text && !settings.renderReferences) return;
  if ("val" in text && !settings.renderValues) return;
  ctx.save();
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  ctx.lineJoin = "round";
  ctx.lineWidth = text.thickness;

  if ("svgpath" in text) {    
    // TODO: This path must be cached!
    const path = new Path2D(text.svgpath);
    if(text.useTrueTypeFontRendering) {            
      ctx.fill(path);
    } else {
      ctx.stroke(path);
    }
    
    ctx.restore();
    return;
  }

  ctx.translate(...text.pos);
  ctx.translate(text.thickness * 0.5, 0);
  var angle = -text.angle;
  if (text.attr.includes("mirrored")) {
    ctx.scale(-1, 1);
    angle = -angle;
  }
  var tilt = 0;
  if (text.attr.includes("italic")) {
    tilt = 0.125;
  }
  var interline = text.height * 1.5 + text.thickness;
  var txt = text.text.split("\n");
  // KiCad ignores last empty line.
  if (txt[txt.length - 1] == '') txt.pop();
  ctx.rotate(deg2rad(angle));
  var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
  offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
  for (var i in txt) {
    var lineWidth = text.thickness + interline / 2 * tilt;
    for (var j = 0; j < txt[i].length; j++) {
      if (txt[i][j] == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        lineWidth += fourSpaces - lineWidth % fourSpaces;
      } else {
        if (txt[i][j] == '~') {
          j++;
          if (j == txt[i].length)
            break;
        }
        lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
      }
    }
    var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
    var inOverbar = false;
    for (var j = 0; j < txt[i].length; j++) {
      if (txt[i][j] == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        offsetx += fourSpaces - offsetx % fourSpaces;
        continue;
      } else if (txt[i][j] == '~') {
        j++;
        if (j == txt[i].length)
          break;
        if (txt[i][j] != '~') {
          inOverbar = !inOverbar;
        }
      }
      var glyph = pcbdata.font_data[txt[i][j]];
      if (inOverbar) {
        var overbarStart = [offsetx, -text.height * 1.4 + offsety];
        var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];

        if (!lastHadOverbar) {
          overbarStart[0] += text.height * 1.4 * tilt;
          lastHadOverbar = true;
        }
        ctx.beginPath();
        ctx.moveTo(...overbarStart);
        ctx.lineTo(...overbarEnd);
        ctx.stroke();
      } else {
        lastHadOverbar = false;
      }
      for (var line of glyph.l) {
        ctx.beginPath();
        ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
        for (var k = 1; k < line.length; k++) {
          ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
        }
        ctx.stroke();
      }
      offsetx += glyph.w * text.width;
    }
    offsety += interline;
  }
  ctx.restore();
}

function drawedge(ctx, scalefactor, edge, color) {
  ctx.strokeStyle = color;
  ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
  ctx.lineCap = "round";
  if ("svgpath" in edge) {
    ctx.stroke(new Path2D(edge.svgpath));
  } else {
    ctx.beginPath();
    if (edge.type == "segment") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(...edge.end);
    }
    if (edge.type == "rect") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(edge.start[0], edge.end[1]);
      ctx.lineTo(...edge.end);
      ctx.lineTo(edge.end[0], edge.start[1]);
      ctx.lineTo(...edge.start);
    }
    if (edge.type == "arc") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        deg2rad(edge.startangle),
        deg2rad(edge.endangle));
    }
    if (edge.type == "circle") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        0, 2 * Math.PI);
      ctx.closePath();
    }
    if (edge.type == "curve") {
      ctx.moveTo(...edge.start);
      ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
    }
    ctx.stroke();
  }
}

function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
  // chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
  var path = new Path2D();
  var width = size[0];
  var height = size[1];
  var x = width * -0.5;
  var y = height * -0.5;
  var chamfOffset = Math.min(width, height) * chamfratio;
  path.moveTo(x, 0);
  if (chamfpos & 4) {
    path.lineTo(x, y + height - chamfOffset);
    path.lineTo(x + chamfOffset, y + height);
    path.lineTo(0, y + height);
  } else {
    path.arcTo(x, y + height, x + width, y + height, radius);
  }
  if (chamfpos & 8) {
    path.lineTo(x + width - chamfOffset, y + height);
    path.lineTo(x + width, y + height - chamfOffset);
    path.lineTo(x + width, 0);
  } else {
    path.arcTo(x + width, y + height, x + width, y, radius);
  }
  if (chamfpos & 2) {
    path.lineTo(x + width, y + chamfOffset);
    path.lineTo(x + width - chamfOffset, y);
    path.lineTo(0, y);
  } else {
    path.arcTo(x + width, y, x, y, radius);
  }
  if (chamfpos & 1) {
    path.lineTo(x + chamfOffset, y);
    path.lineTo(x, y + chamfOffset);
    path.lineTo(x, 0);
  } else {
    path.arcTo(x, y, x, y + height, radius);
  }
  path.closePath();
  return path;
}

function getOblongPath(size) {
  return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}

function getPolygonsPath(shape) {
  if (shape.path2d) {
    return shape.path2d;
  }
  if ("svgpath" in shape) {
    shape.path2d = new Path2D(shape.svgpath);
  } else {
    var path = new Path2D();
    for (var polygon of shape.polygons) {
      path.moveTo(...polygon[0]);
      for (var i = 1; i < polygon.length; i++) {
        path.lineTo(...polygon[i]);
      }
      path.closePath();
    }
    shape.path2d = path;
  }
  return shape.path2d;
}

function drawPolygonShape(ctx, shape, color) {
  ctx.save();
  ctx.fillStyle = color;
  if (!("svgpath" in shape)) {
    ctx.translate(...shape.pos);
    ctx.rotate(deg2rad(-shape.angle));
  }
  ctx.fill(getPolygonsPath(shape));
  ctx.restore();
}


function drawPolylineShape(ctx, shape, color) {
  ctx.save();
  ctx.strokeStyle = color;
  ctx.lineWidth = shape.width;
  if (!("svgpath" in shape)) {
    ctx.translate(...shape.pos);
    ctx.rotate(deg2rad(-shape.angle));
  }
  ctx.stroke(getPolygonsPath(shape));
  ctx.restore();
}

function drawDrawing(ctx, scalefactor, drawing, color) {  
  if (["segment", "arc", "circle", "curve"].includes(drawing.type)) {
    drawedge(ctx, scalefactor, drawing, color);
  } else if (drawing.type == "polygon") {
    drawPolygonShape(ctx, drawing, color);
  } else if (drawing.type == "text") {    
    drawText(ctx, drawing, color);
  } else if (drawing.type == "polyline") {    
    drawPolylineShape(ctx, drawing, color);
  }
}

function getCirclePath(radius) {
  var path = new Path2D();
  path.arc(0, 0, radius, 0, 2 * Math.PI);
  path.closePath();
  return path;
}

function getCachedPadPath(pad) {
  if (!pad.path2d) {
    // if path2d is not set, build one and cache it on pad object
    if (pad.shape == "rect") {
      pad.path2d = new Path2D();
      pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
    } else if (pad.shape == "oval") {
      pad.path2d = getOblongPath(pad.size);
    } else if (pad.shape == "circle") {
      pad.path2d = getCirclePath(pad.size[0] / 2);
    } else if (pad.shape == "roundrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
    } else if (pad.shape == "chamfrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
    } else if (pad.shape == "custom") {
      pad.path2d = getPolygonsPath(pad);
    } else if(pad.shape === "polygon") {      
      pad.path2d = new Path2D();
      if(pad.polygon.length > 1) {
        const pos = {
          x: pad.pos[0],
          y: pad.pos[1]
        };

        pad.path2d.moveTo(pad.polygon[0].x - pos.x, pad.polygon[0].y - pos.y);
        for (var i = 1; i < pad.polygon.length; i++) {
          const point = pad.polygon[i];          
          pad.path2d.lineTo(point.x - pos.x, point.y - pos.y);
        }
        pad.path2d.closePath();              
      }
    }
  }
  return pad.path2d;
}

function drawPad(ctx, pad, color, outline) {
  ctx.save();
  ctx.translate(...pad.pos);
  if(pad.shape !== 'polygon') {
    ctx.rotate(deg2rad(pad.angle));  
  } else {
    ctx.rotate(deg2rad(0));  
  }
  
  if (pad.offset) {
    ctx.translate(...pad.offset);
  }
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  var path = getCachedPadPath(pad);
  if (outline) {
    ctx.stroke(path);
  } else {
    ctx.fill(path);
  }
  ctx.restore();
}

function drawPadHole(ctx, pad, padHoleColor) {
  if (pad.type != "th") {
    return
  };

  ctx.save();
  ctx.translate(pad.holeCenterPoint.x, pad.holeCenterPoint.y);    
  ctx.rotate(deg2rad(pad.angle));
  ctx.fillStyle = padHoleColor;
  if (pad.drillshape == "oblong") {
    ctx.fill(getOblongPath(pad.drillsize));
  } else {
    ctx.fill(getCirclePath(pad.drillsize[0] / 2));
  }
  ctx.restore();
}

function drawFootprint(ctx, layer, scalefactor, footprint, padColor, padHoleColor, outlineColor, highlight, outline) {
  if (highlight) {
    // draw bounding box
    if (footprint.layer == layer) {
      ctx.save();
      ctx.globalAlpha = 0.2;
      ctx.translate(...footprint.bbox.pos);
      ctx.rotate(deg2rad(-footprint.bbox.angle));
      ctx.translate(...footprint.bbox.relpos);
      ctx.fillStyle = padColor;
      ctx.fillRect(0, 0, ...footprint.bbox.size);
      ctx.globalAlpha = 1;
      ctx.strokeStyle = padColor;
      ctx.strokeRect(0, 0, ...footprint.bbox.size);
      ctx.restore();
    }
  }
  // draw drawings
  for (var drawing of footprint.drawings) {
    if (drawing.layer == layer) {
      drawDrawing(ctx, scalefactor, drawing.drawing, padColor);
    }
  }
  // draw pads
  if (settings.renderPads) {
    for (var pad of footprint.pads) {
      if (pad.layers.includes(layer)) {
        drawPad(ctx, pad, padColor, outline);
        if (pad.pin1 && settings.highlightpin1) {
          drawPad(ctx, pad, outlineColor, true);
        }
      }
    }
    for (var pad of footprint.pads) {
      drawPadHole(ctx, pad, padHoleColor);
    }
  }
}

function drawCrosshair(canvas, x, y, scalefactor, color) {
  if(!settings.showCrosshair) {
    return;
  }

  var ctx = canvas.getContext("2d");

  HTMLFormControlsCollection.log
  
  ctx.save();
  ctx.globalAlpha = 0.75;
  ctx.lineWidth = 2 / scalefactor;
  ctx.strokeStyle = color;

  // TODO: Should calculate a proper bbox for the view port.
  const dummyOffset = 4000;

  // horz line
  ctx.beginPath();
  ctx.moveTo(x - dummyOffset, y);
  ctx.lineTo(x + dummyOffset, y);
  ctx.stroke();

  // vert line
  ctx.beginPath();
  ctx.moveTo(x, y - dummyOffset);
  ctx.lineTo(x, y + dummyOffset);
  ctx.stroke();

  ctx.globalAlpha = 1;
  ctx.restore();
}

function drawEdgeCuts(canvas, scalefactor) {
  var ctx = canvas.getContext("2d");
  var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
  for (var edge of pcbdata.edges) {
    drawedge(ctx, scalefactor, edge, edgecolor);
  }
}

function drawOrphanPads(canvas, layer, scalefactor, highlight, highlightedPads) {
  if (!settings.renderPads) {
    return;
  }

  highlightedPads = highlightedPads || [];

  var ctx = canvas.getContext("2d");
  ctx.save();
  ctx.lineWidth = 3 / scalefactor;
  var style = getComputedStyle(topmostdiv);
  var padColor = style.getPropertyValue('--pad-color');
  var padHoleColor = style.getPropertyValue('--pad-hole-color');  
  if (highlight) {
    padColor = style.getPropertyValue('--pad-color-highlight');
    outlineColor = style.getPropertyValue('--pin1-outline-color-highlight');
  }

  var i = 0;
  for (var pad of pcbdata.pads) {
    if (pad.layers.includes(layer)) {
      var outline = settings.renderDnpOutline;
      if (!highlight || highlightedPads.includes(i)) {
        drawPad(ctx, pad, padColor, outline); 
      }     
    }

    i++;
  }
  
  for (var pad of pcbdata.pads) {
    drawPadHole(ctx, pad, padHoleColor);
  }  

  ctx.restore();
}

function drawFootprints(canvas, layer, scalefactor, highlight) {
  var ctx = canvas.getContext("2d");
  ctx.save();
  ctx.lineWidth = 3 / scalefactor;
  var style = getComputedStyle(topmostdiv);
  var padColor = style.getPropertyValue('--pad-color');
  var padHoleColor = style.getPropertyValue('--pad-hole-color');
  var outlineColor = style.getPropertyValue('--pin1-outline-color');
  if (highlight) {
    padColor = style.getPropertyValue('--pad-color-highlight');
    outlineColor = style.getPropertyValue('--pin1-outline-color-highlight');
  }
  for (var i = 0; i < pcbdata.footprints.length; i++) {
    var mod = pcbdata.footprints[i];
    var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
    if (!highlight || highlightedFootprints.includes(i)) {
      drawFootprint(ctx, layer, scalefactor, mod, padColor, padHoleColor, outlineColor, highlight, outline);
    }
  }
  ctx.restore();
}

function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
  var ctx = canvas.getContext("2d");
  for (var d of pcbdata.drawings[layername][layer]) {
    if (["segment", "arc", "circle", "curve", "rect","polyline"].includes(d.type)) {
      drawedge(ctx, scalefactor, d, edgeColor);
    } else if (d.type == "polygon") {
      drawPolygonShape(ctx, d, polygonColor);
    } else if (d.type == "text") {
      drawText(ctx, d, polygonColor);
    }
  }
}

function drawTracks(canvas, layer, color, highlight) {
  ctx = canvas.getContext("2d");
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  for(var track of pcbdata.tracks[layer]) {
    if (highlight && highlightedNet != track.net) continue;
    ctx.lineWidth = track.width;

    if(track.type === 'polyline') {
      drawPolylineShape(ctx,track,color);
    } else if(track.type === 'polygon') {
      drawPolygonShape(ctx, track, color);
    } else if(track.type === 'text') {
      drawText(ctx, track, color);
    } else {
      if ('radius' in track) {
        ctx.beginPath();
        ctx.arc(
            ...track.center,
            track.radius,
            deg2rad(track.startangle),
            deg2rad(track.endangle));
        ctx.stroke();
      } else if('start' in track && 'end' in track) {
        ctx.beginPath();
        ctx.moveTo(...track.start);
        ctx.lineTo(...track.end);
        ctx.stroke();
      }
      
    }

  }
}

function drawZones(canvas, layer, color, highlight) {
  ctx = canvas.getContext("2d");
  ctx.save();
  ctx.strokeStyle = color;
  ctx.fillStyle = color;
  ctx.lineJoin = "round";
  for(var zone of pcbdata.zones[layer]) {
    if (!zone.path2d) {
      zone.path2d = getPolygonsPath(zone);
    }
    if (highlight && highlightedNet != zone.net) continue;
    ctx.fill(zone.path2d);
    if (zone.width > 0) {
      ctx.lineWidth = zone.width;
      ctx.stroke(zone.path2d);
    }
  }
  ctx.restore();
}

function clearCanvas(canvas, color = null) {
  var ctx = canvas.getContext("2d");
  ctx.save();
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  if (color) {
    ctx.fillStyle = color;
    ctx.fillRect(0, 0, canvas.width, canvas.height);
  } else {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
  }
  ctx.restore();
}

function drawNets(canvas, layer, highlight) {
  var style = getComputedStyle(topmostdiv);
  if (settings.renderTracks) {
    var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
    drawTracks(canvas, layer, trackColor, highlight);
  }
  if (settings.renderZones) {
    var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
    drawZones(canvas, layer, zoneColor, highlight);
  }
  if (highlight && settings.renderPads) {
    var padColor = style.getPropertyValue('--pad-color-highlight');
    var padHoleColor = style.getPropertyValue('--pad-hole-color');
    var ctx = canvas.getContext("2d");
    for (var footprint of pcbdata.footprints) {
      // draw pads
      var padDrawn = false;
      for (var pad of footprint.pads) {
        if (highlightedNet != pad.net) continue;
        if (pad.layers.includes(layer)) {
          drawPad(ctx, pad, padColor, false);
          padDrawn = true;
        }
      }
      if (padDrawn) {
        // redraw all pad holes because some pads may overlap
        for (var pad of footprint.pads) {
          drawPadHole(ctx, pad, padHoleColor);
        }
      }
    }
  }
}

function drawHighlightsOnLayer(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.highlight);
  }
  
  if (highlightedFootprints.length > 0) {
    drawFootprints(canvasdict.highlight, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom, true);
  }

  // Draw crosshairs
  if (highlightedFootprints.length > 0) {
    for(var i = 0; i < pcbdata.footprints.length; i++) {
      const footprint = pcbdata.footprints[i];
      if(highlightedFootprints.includes(i) && footprint.layer === canvasdict.layer) {
        drawCrosshair(canvasdict.highlight, footprint.center[0], footprint.center[1], canvasdict.transform.s * canvasdict.transform.zoom, 'red');
      }
    }
  }

  if (highlightedNet !== null) {
    var highlightedPads = [];
    for(var i = 0; i < pcbdata.pads.length; i++) {
      var pad = pcbdata.pads[i];
      if(pad.net === highlightedNet) {
        highlightedPads.push(i);
      }
    }
    
    drawOrphanPads(canvasdict.highlight, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom, true, highlightedPads);

    drawNets(canvasdict.highlight, canvasdict.layer, true);
  }
}

function drawHighlights() {
  drawHighlightsOnLayer(allcanvas.front);
  drawHighlightsOnLayer(allcanvas.back);
}

function drawBackground(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.bg);
    clearCanvas(canvasdict.fab);
    clearCanvas(canvasdict.silk);
  }

  drawNets(canvasdict.bg, canvasdict.layer, false);

  drawOrphanPads(canvasdict.bg, canvasdict.layer, canvasdict.transform.s * canvasdict.transform.zoom, false);

  drawFootprints(canvasdict.bg, canvasdict.layer, canvasdict.transform.s * canvasdict.transform.zoom, false);

  drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);

  var style = getComputedStyle(topmostdiv);
  var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
  var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
  var textColor = style.getPropertyValue('--silkscreen-text-color');
  if (settings.renderSilkscreen) {
    drawBgLayer(
      "silkscreen", canvasdict.silk, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
  edgeColor = style.getPropertyValue('--fabrication-edge-color');
  polygonColor = style.getPropertyValue('--fabrication-polygon-color');
  textColor = style.getPropertyValue('--fabrication-text-color');
  if (settings.renderFabrication) {
    drawBgLayer(
      "fabrication", canvasdict.fab, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
}

function prepareCanvas(canvas, flip, transform) {
  var ctx = canvas.getContext("2d");
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  var fontsize = 1.55;
  ctx.scale(transform.zoom, transform.zoom);
  ctx.translate(transform.panx, transform.pany);
  if (flip) {
    ctx.scale(-1, 1);
  }
  ctx.translate(transform.x, transform.y);
  ctx.rotate(deg2rad(settings.boardRotation));
  ctx.scale(transform.s, transform.s);
}

function prepareLayer(canvasdict) {
  var flip = (canvasdict.layer == "B");
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    prepareCanvas(canvasdict[c], flip, canvasdict.transform);
  }
}

function rotateVector(v, angle) {
  angle = deg2rad(angle);
  return [
    v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
    v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
  ];
}

function applyRotation(bbox) {
  var corners = [
    [bbox.minx, bbox.miny],
    [bbox.minx, bbox.maxy],
    [bbox.maxx, bbox.miny],
    [bbox.maxx, bbox.maxy],
  ];
  corners = corners.map((v) => rotateVector(v, settings.boardRotation));
  return {
    minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
    miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
    maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
    maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
  }
}

function recalcLayerScale(layerdict, width, height) {
  var bbox = applyRotation(pcbdata.edges_bbox);
  var scalefactor = 0.98 * Math.min(
    width / (bbox.maxx - bbox.minx),
    height / (bbox.maxy - bbox.miny)
  );
  if (scalefactor < 0.1) {
    scalefactor = 1;
  }
  layerdict.transform.s = scalefactor;
  var flip = (layerdict.layer == "B");
  if (flip) {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
  } else {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
  }
  layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    canvas = layerdict[c];
    canvas.width = width;
    canvas.height = height;
    canvas.style.width = (width / devicePixelRatio) + "px";
    canvas.style.height = (height / devicePixelRatio) + "px";
  }
}

function redrawCanvas(layerdict) {
  prepareLayer(layerdict);
  drawBackground(layerdict);
  drawHighlightsOnLayer(layerdict);
}

function resizeCanvas(layerdict) {
  var canvasdivid = {
    "F": "frontcanvas",
    "B": "backcanvas"
  } [layerdict.layer];
  var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
  var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
  recalcLayerScale(layerdict, width, height);
  redrawCanvas(layerdict);
}

function resizeAll() {
  resizeCanvas(allcanvas.front);
  resizeCanvas(allcanvas.back);
}

function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
  var A = x - x1;
  var B = y - y1;
  var C = x2 - x1;
  var D = y2 - y1;

  var dot = A * C + B * D;
  var len_sq = C * C + D * D;
  var dx, dy;
  if (len_sq == 0) {
    // start and end of the segment coincide
    dx = x - x1;
    dy = y - y1;
  } else {
    var param = dot / len_sq;
    var xx, yy;
    if (param < 0) {
      xx = x1;
      yy = y1;
    } else if (param > 1) {
      xx = x2;
      yy = y2;
    } else {
      xx = x1 + param * C;
      yy = y1 + param * D;
    }
    dx = x - xx;
    dy = y - yy;
  }
  return dx * dx + dy * dy <= d * d;
}

function modulo(n, mod) {
  return ((n % mod) + mod ) % mod;
}

function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
  var dx = x - xc;
  var dy = y - yc;
  var r_sq = dx * dx + dy * dy;
  var rmin = Math.max(0, radius-d);
  var rmax = radius + d;

  if (r_sq < rmin * rmin || r_sq > rmax * rmax)
    return false;

  var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
  var dx1 = xc + radius * Math.cos(angle1) - x;
  var dy1 = yc + radius * Math.sin(angle1) - y;
  if (dx1 * dx1 + dy1 * dy1 <= d * d)
    return true;

  var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
  var dx2 = xc + radius * Math.cos(angle2) - x;
  var dy2 = yc + radius * Math.sin(angle2) - y;
  if (dx2 * dx2 + dy2 * dy2 <= d * d)
    return true;

  var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
  if (angle1 > angle2)
    return (angle >= angle2 || angle <= angle1);
  else
    return (angle >= angle1 && angle <= angle2);
}

function pointWithinPad(x, y, pad) {
  var v = [x - pad.pos[0], y - pad.pos[1]];
  v = rotateVector(v, -pad.angle);
  if (pad.offset) {
    v[0] -= pad.offset[0];
    v[1] -= pad.offset[1];
  }
  return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}

function netHitScan(layer, x, y) {
  // TODO: Should be refactored

  // Check track segments
  if (settings.renderTracks && pcbdata.tracks) {
    for(var track of pcbdata.tracks[layer]) {
      if(track.type === 'polyline') {
        const path = getPolygonsPath(track);
        if(path) {
          hitTestContext2d.save();
          hitTestContext2d.lineWidth = track.width;
          
          if(hitTestContext2d.isPointInStroke(path,x,y)) {
            hitTestContext2d.restore();
            return track.net;            
          }
          
          hitTestContext2d.restore();          
        }        

      } else if(track.type === 'polygon') {
        const path = getPolygonsPath(track);
        if(path && hitTestContext2d.isPointInPath(path,x,y)) {          
          return track.net;                      
        }                     
      } else if(track.type === 'text') {
        // TODO: To implement taking in account TrueType fonts.
      } else if ('radius' in track) {
        if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
          return track.net;
        }
      } else if('start' in track && 'end' in track) {
        if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
          return track.net;
        }
      }
    }
  }
  // Check pads
  if (settings.renderPads) {

    // Footprints containing pads
    for (var footprint of pcbdata.footprints) {
      for(var pad of footprint.pads) {
        if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
          return pad.net;
        }
      }
    }

    // Orphan pads
    for(var pad of pcbdata.pads) {
      if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
        return pad.net;
      }
    }
  }
  return null;
}

function pointWithinFootprintBbox(x, y, bbox) {
  var v = [x - bbox.pos[0], y - bbox.pos[1]];
  v = rotateVector(v, bbox.angle);
  return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
         bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}

function bboxHitScan(layer, x, y) {
  var result = [];
  for (var i = 0; i < pcbdata.footprints.length; i++) {
    var footprint = pcbdata.footprints[i];
    if (footprint.layer == layer) {
      if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
        result.push(i);
      }
    }
  }
  return result;
}

function handlePointerDown(e, layerdict) {
  if (e.button != 0 && e.button != 1) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  layerdict.pointerStates[e.pointerId] = {
    distanceTravelled: 0,
    lastX: e.offsetX,
    lastY: e.offsetY,
    downTime: Date.now(),
  };
}

function handleMouseClick(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var x = e.offsetX;
  var y = e.offsetY;
  var t = layerdict.transform;
  if (layerdict.layer == "B") {
    x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
  } else {
    x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
  }
  y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
  var v = rotateVector([x, y], -settings.boardRotation);
  if ("nets" in pcbdata) {
    var net = netHitScan(layerdict.layer, ...v);
    if (net !== highlightedNet) {
      netClicked(net);
    }
  }
  if (highlightedNet === null) {
    var footprints = bboxHitScan(layerdict.layer, ...v);
    if (footprints.length > 0) {
      footprintsClicked(footprints);
    }
  }
}

function handlePointerLeave(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();

  if (!settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }

  delete layerdict.pointerStates[e.pointerId];
}

function resetTransform(layerdict) {
  layerdict.transform.panx = 0;
  layerdict.transform.pany = 0;
  layerdict.transform.zoom = 1;
  redrawCanvas(layerdict);
}

function handlePointerUp(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  e.preventDefault();
  e.stopPropagation();

  if (e.button == 2) {
    // Reset pan and zoom on right click.
    resetTransform(layerdict);
    layerdict.anotherPointerTapped = false;
    return;
  }

  // We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
  var ptr = layerdict.pointerStates[e.pointerId];
  ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);

  if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
    if (Object.keys(layerdict.pointerStates).length == 1) {
      if (layerdict.anotherPointerTapped) {
        // This is the second pointer coming off of a two-finger tap
        resetTransform(layerdict);
      } else {
        // This is just a regular tap
        handleMouseClick(e, layerdict);
      }
      layerdict.anotherPointerTapped = false;
    } else {
      // This is the first finger coming off of what could become a two-finger tap
      layerdict.anotherPointerTapped = true;
    }
  } else {
    if (!settings.redrawOnDrag) {
      redrawCanvas(layerdict);
    }
    layerdict.anotherPointerTapped = false;
  }

  delete layerdict.pointerStates[e.pointerId];
}

function handlePointerMove(e, layerdict) {
  if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var thisPtr = layerdict.pointerStates[e.pointerId];

  var dx = e.offsetX - thisPtr.lastX;
  var dy = e.offsetY - thisPtr.lastY;

  // If this number is low on pointer up, we count the action as a click
  thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);

  if (Object.keys(layerdict.pointerStates).length == 1) {
    // This is a simple drag
    layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
    layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
  } else if (Object.keys(layerdict.pointerStates).length == 2) {
    var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];

    var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
    var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2)     + Math.pow(e.offsetY - otherPtr.lastY, 2));

    var scaleFactor = newDist/oldDist;

    if (scaleFactor != NaN) {
      layerdict.transform.zoom *= scaleFactor;

      var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
      layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
      layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
    }
  }

  thisPtr.lastX = e.offsetX;
  thisPtr.lastY = e.offsetY;

  if (settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }
}

function handleMouseWheel(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();
  var t = layerdict.transform;
  var wheeldelta = e.deltaY;
  if (e.deltaMode == 1) {
    // FF only, scroll by lines
    wheeldelta *= 30;
  } else if (e.deltaMode == 2) {
    wheeldelta *= 300;
  }
  var m = Math.pow(1.1, -wheeldelta / 40);
  // Limit amount of zoom per tick.
  if (m > 2) {
    m = 2;
  } else if (m < 0.5) {
    m = 0.5;
  }
  t.zoom *= m;
  var zoomd = (1 - m) / t.zoom;
  t.panx += devicePixelRatio * e.offsetX * zoomd;
  t.pany += devicePixelRatio * e.offsetY * zoomd;
  redrawCanvas(layerdict);
}

function addMouseHandlers(div, layerdict) {
  div.addEventListener("pointerdown", function(e) {
    handlePointerDown(e, layerdict);
  });
  div.addEventListener("pointermove", function(e) {
    handlePointerMove(e, layerdict);
  });
  div.addEventListener("pointerup", function(e) {
    handlePointerUp(e, layerdict);
  });
  var pointerleave = function(e) {
    handlePointerLeave(e, layerdict);
  }
  div.addEventListener("pointercancel", pointerleave);
  div.addEventListener("pointerleave", pointerleave);
  div.addEventListener("pointerout", pointerleave);

  div.onwheel = function(e) {
    handleMouseWheel(e, layerdict);
  }
  for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
    element.addEventListener("contextmenu", function(e) {
      e.preventDefault();
    }, false);
  }
}

function setRedrawOnDrag(value) {
  settings.redrawOnDrag = value;
  writeStorage("redrawOnDrag", value);
}

function setShowCrosshair(value) {
  settings.showCrosshair = value;
  writeStorage("showCrosshair", value);
}

function setBoardRotation(value) {
  settings.boardRotation = value * 5;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  resizeAll();
}

function initRender() {
  allcanvas = {
    front: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("F_bg"),
      fab: document.getElementById("F_fab"),
      silk: document.getElementById("F_slk"),
      highlight: document.getElementById("F_hl"),
      layer: "F",
    },
    back: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("B_bg"),
      fab: document.getElementById("B_fab"),
      silk: document.getElementById("B_slk"),
      highlight: document.getElementById("B_hl"),
      layer: "B",
    }
  };
  addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
  addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/* DOM manipulation and misc code */

var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var footprintIndexToHandler = {};
var netsToHandler = {};
var highlightedFootprints = [];
var highlightedOrphanPads = [];
var highlightedNet = null;
var lastClicked;

function dbg(html) {
  dbgdiv.innerHTML = html;
}

function redrawIfInitDone() {
  if (initDone) {
    redrawCanvas(allcanvas.front);
    redrawCanvas(allcanvas.back);
  }
}

function padsVisible(value) {
  writeStorage("padsVisible", value);
  settings.renderPads = value;
  redrawIfInitDone();
}

function referencesVisible(value) {
  writeStorage("referencesVisible", value);
  settings.renderReferences = value;
  redrawIfInitDone();
}

function valuesVisible(value) {
  writeStorage("valuesVisible", value);
  settings.renderValues = value;
  redrawIfInitDone();
}

function tracksVisible(value) {
  writeStorage("tracksVisible", value);
  settings.renderTracks = value;
  redrawIfInitDone();
}

function zonesVisible(value) {
  writeStorage("zonesVisible", value);
  settings.renderZones = value;
  redrawIfInitDone();
}

function dnpOutline(value) {
  writeStorage("dnpOutline", value);
  settings.renderDnpOutline = value;
  redrawIfInitDone();
}

function setDarkMode(value) {
  if (value) {
    topmostdiv.classList.add("dark");
  } else {
    topmostdiv.classList.remove("dark");
  }
  writeStorage("darkmode", value);
  settings.darkMode = value;
  redrawIfInitDone();
}

function setFullscreen(value) {
  if (value) {
    document.documentElement.requestFullscreen();
  } else {
    document.exitFullscreen();
  }
}

function fabricationVisible(value) {
  writeStorage("fabricationVisible", value);
  settings.renderFabrication = value;
  redrawIfInitDone();
}

function silkscreenVisible(value) {
  writeStorage("silkscreenVisible", value);
  settings.renderSilkscreen = value;
  redrawIfInitDone();
}

function setHighlightPin1(value) {
  writeStorage("highlightpin1", value);
  settings.highlightpin1 = value;
  redrawIfInitDone();
}

function getStoredCheckboxRefs(checkbox) {
  function convert(ref) {
    var intref = parseInt(ref);
    if (isNaN(intref)) {
      for (var i = 0; i < pcbdata.footprints.length; i++) {
        if (pcbdata.footprints[i].ref == ref) {
          return i;
        }
      }
      return -1;
    } else {
      return intref;
    }
  }
  if (!(checkbox in settings.checkboxStoredRefs)) {
    var val = readStorage("checkbox_" + checkbox);
    settings.checkboxStoredRefs[checkbox] = val ? val : "";
  }
  if (!settings.checkboxStoredRefs[checkbox]) {
    return new Set();
  } else {
    return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
  }
}

function getCheckboxState(checkbox, references) {
  var storedRefsSet = getStoredCheckboxRefs(checkbox);
  var currentRefsSet = new Set(references.map(r => r[1]));
  // Get difference of current - stored
  var difference = new Set(currentRefsSet);
  for (ref of storedRefsSet) {
    difference.delete(ref);
  }
  if (difference.size == 0) {
    // All the current refs are stored
    return "checked";
  } else if (difference.size == currentRefsSet.size) {
    // None of the current refs are stored
    return "unchecked";
  } else {
    // Some of the refs are stored
    return "indeterminate";
  }
}

function setBomCheckboxState(checkbox, element, references) {
  var state = getCheckboxState(checkbox, references);
  element.checked = (state == "checked");
  element.indeterminate = (state == "indeterminate");
}

function createCheckboxChangeHandler(checkbox, references, row) {
  return function() {
    refsSet = getStoredCheckboxRefs(checkbox);
    var darkenWhenChecked = settings.darkenWhenChecked == checkbox;
    eventArgs = {
      checkbox: checkbox,
      refs: references,
    }
    if (this.checked) {
      // checkbox ticked
      for (var ref of references) {
        refsSet.add(ref[1]);
      }
      if (darkenWhenChecked) {
        row.classList.add("checked");
      }
      eventArgs.state = 'checked';
    } else {
      // checkbox unticked
      for (var ref of references) {
        refsSet.delete(ref[1]);
      }
      if (darkenWhenChecked) {
        row.classList.remove("checked");
      }
      eventArgs.state = 'unchecked';
    }
    settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
    updateCheckboxStats(checkbox);
    EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
  }
}

function clearHighlightedFootprints() {
  if (currentHighlightedRowId) {
    document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    currentHighlightedRowId = null;
    highlightedFootprints = [];  
    highlightedOrphanPads = [];  
    highlightedNet = null;
  }
}

function createRowHighlightHandler(rowid, refs, net) {
  return function() {
    if (currentHighlightedRowId) {
      if (currentHighlightedRowId == rowid) {
        return;
      }
      document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    }
    document.getElementById(rowid).classList.add("highlighted");
    currentHighlightedRowId = rowid;
    highlightedFootprints = refs ? refs.map(r => r[1]) : [];
    highlightedNet = net;
    drawHighlights();
    EventHandler.emitEvent(
      IBOM_EVENT_TYPES.HIGHLIGHT_EVENT,
      {
        rowid: rowid,
        refs: refs,
        net: net
      });
  }
}

function entryMatches(entry) {
  if (settings.bommode == "netlist") {
    // entry is just a net name
    return entry.toLowerCase().indexOf(filter) >= 0;
  }
  // check refs
  for (var ref of entry[3]) {
    if (ref[0].toLowerCase().indexOf(filter) >= 0) {
      return true;
    }
  }
  // check extra fields
  for (var i in config.extra_fields) {
    if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
      return true;
    }
  }
  // check value
  if (entry[1].toLowerCase().indexOf(filter) >= 0) {
    return true;
  }
  // check footprint
  if (entry[2].toLowerCase().indexOf(filter) >= 0) {
    return true;
  }
  return false;
}

function findRefInEntry(entry) {
  return entry[3].filter(r => r[0].toLowerCase() == reflookup);
}

function highlightFilter(s) {
  if (!filter) {
    return s;
  }
  var parts = s.toLowerCase().split(filter);
  if (parts.length == 1) {
    return s;
  }
  var r = "";
  var pos = 0;
  for (var i in parts) {
    if (i > 0) {
      r += '<mark class="highlight">' +
        s.substring(pos, pos + filter.length) +
        '</mark>';
      pos += filter.length;
    }
    r += s.substring(pos, pos + parts[i].length);
    pos += parts[i].length;
  }
  return r;
}

function checkboxSetUnsetAllHandler(checkboxname) {
  return function() {
    var checkboxnum = 0;
    while (checkboxnum < settings.checkboxes.length &&
      settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
      checkboxnum++;
    }
    if (checkboxnum >= settings.checkboxes.length) {
      return;
    }
    var allset = true;
    var checkbox;
    var row;
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      if (!checkbox.checked || checkbox.indeterminate) {
        allset = false;
        break;
      }
    }
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      checkbox.checked = !allset;
      checkbox.indeterminate = false;
      checkbox.onchange();
    }
  }
}

function createColumnHeader(name, cls, comparator) {
  var th = document.createElement("TH");
  th.innerHTML = name;
  th.classList.add(cls);
  th.style.cursor = "pointer";
  var span = document.createElement("SPAN");
  span.classList.add("sortmark");
  span.classList.add("none");
  th.appendChild(span);
  th.onclick = function() {
    if (currentSortColumn && this !== currentSortColumn) {
      // Currently sorted by another column
      currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
      currentSortColumn.childNodes[1].classList.add("none");
      currentSortColumn = null;
      currentSortOrder = null;
    }
    if (currentSortColumn && this === currentSortColumn) {
      // Already sorted by this column
      if (currentSortOrder == "asc") {
        // Sort by this column, descending order
        bomSortFunction = function(a, b) {
          return -comparator(a, b);
        }
        currentSortColumn.childNodes[1].classList.remove("asc");
        currentSortColumn.childNodes[1].classList.add("desc");
        currentSortOrder = "desc";
      } else {
        // Unsort
        bomSortFunction = null;
        currentSortColumn.childNodes[1].classList.remove("desc");
        currentSortColumn.childNodes[1].classList.add("none");
        currentSortColumn = null;
        currentSortOrder = null;
      }
    } else {
      // Sort by this column, ascending order
      bomSortFunction = comparator;
      currentSortColumn = this;
      currentSortColumn.childNodes[1].classList.remove("none");
      currentSortColumn.childNodes[1].classList.add("asc");
      currentSortOrder = "asc";
    }
    populateBomBody();
  }
  return th;
}

function populateBomHeader() {
  while (bomhead.firstChild) {
    bomhead.removeChild(bomhead.firstChild);
  }
  var tr = document.createElement("TR");
  var th = document.createElement("TH");
  th.classList.add("numCol");
  tr.appendChild(th);
  var checkboxCompareClosure = function(checkbox) {
    return (a, b) => {
      var stateA = getCheckboxState(checkbox, a[3]);
      var stateB = getCheckboxState(checkbox, b[3]);
      if (stateA > stateB) return -1;
      if (stateA < stateB) return 1;
      return 0;
    }
  }
  if (settings.bommode == "netlist") {
    th = createColumnHeader("Net name", "bom-netname", (a, b) => {
      if (a > b) return -1;
      if (a < b) return 1;
      return 0;
    });
    tr.appendChild(th);
  } else {
    for (var checkbox of settings.checkboxes) {
      th = createColumnHeader(
        checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
      th.onclick = fancyDblClickHandler(
        th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
      tr.appendChild(th);
    }
    tr.appendChild(createColumnHeader("References", "References", (a, b) => {
      var i = 0;
      while (i < a[3].length && i < b[3].length) {
        if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
        i++;
      }
      return a[3].length - b[3].length;
    }));
    // Extra fields
    if (config.extra_fields.length > 0) {
      var extraFieldCompareClosure = function(fieldIndex) {
        return (a, b) => {
          var fa = a[4][fieldIndex];
          var fb = b[4][fieldIndex];
          if (fa != fb) return fa > fb ? 1 : -1;
          else return 0;
        }
      }
      for (var i in config.extra_fields) {
        tr.appendChild(createColumnHeader(
          config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
      }
    }
    tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
      return valueCompare(a[5], b[5], a[1], b[1]);
    }));
    tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
      if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
      else return 0;
    }));
    if (settings.bommode == "grouped") {
      tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
        return a[3].length - b[3].length;
      }));
    }
  }
  bomhead.appendChild(tr);
}

function populateBomBody() {
  while (bom.firstChild) {
    bom.removeChild(bom.firstChild);
  }
  highlightHandlers = [];
  footprintIndexToHandler = {};
  netsToHandler = {};
  currentHighlightedRowId = null;
  var first = true;
  if (settings.bommode == "netlist") {
    bomtable = pcbdata.nets.slice();
  } else {
    switch (settings.canvaslayout) {
      case 'F':
        bomtable = pcbdata.bom.F.slice();
        break;
      case 'FB':
        bomtable = pcbdata.bom.both.slice();
        break;
      case 'B':
        bomtable = pcbdata.bom.B.slice();
        break;
    }
    if (settings.bommode == "ungrouped") {
      // expand bom table
      expandedTable = []
      for (var bomentry of bomtable) {
        for (var ref of bomentry[3]) {
          expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
        }
      }
      bomtable = expandedTable;
    }
  }
  if (bomSortFunction) {
    bomtable = bomtable.sort(bomSortFunction);
  }
  for (var i in bomtable) {
    var bomentry = bomtable[i];
    if (filter && !entryMatches(bomentry)) {
      continue;
    }
    var references = null;
    var netname = null;
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    var rownum = +i + 1;
    tr.id = "bomrow" + rownum;
    td.textContent = rownum;
    tr.appendChild(td);
    if (settings.bommode == "netlist") {
      netname = bomentry;
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
      tr.appendChild(td);
    } else {
      if (reflookup) {
        references = findRefInEntry(bomentry);
        if (references.length == 0) {
          continue;
        }
      } else {
        references = bomentry[3];
      }
      // Checkboxes
      for (var checkbox of settings.checkboxes) {
        if (checkbox) {
          td = document.createElement("TD");
          var input = document.createElement("input");
          input.type = "checkbox";
          input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
          setBomCheckboxState(checkbox, input, references);
          if (input.checked && settings.darkenWhenChecked == checkbox) {
            tr.classList.add("checked");
          }
          td.appendChild(input);
          tr.appendChild(td);
        }
      }
      // References
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
      tr.appendChild(td);
      // Extra fields
      for (var i in config.extra_fields) {
        td = document.createElement("TD");
        td.innerHTML = highlightFilter(bomentry[4][i]);
        tr.appendChild(td);
      }
      // Value
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(bomentry[1]);
      tr.appendChild(td);
      // Footprint
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(bomentry[2]);
      tr.appendChild(td);
      if (settings.bommode == "grouped") {
        // Quantity
        td = document.createElement("TD");
        td.textContent = bomentry[3].length;
        tr.appendChild(td);
      }
    }
    bom.appendChild(tr);
    var handler = createRowHighlightHandler(tr.id, references, netname);
    tr.onmousemove = handler;
    highlightHandlers.push({
      id: tr.id,
      handler: handler,
    });
    if (references !== null) {
      for (var refIndex of references.map(r => r[1])) {
        footprintIndexToHandler[refIndex] = handler;
      }
    }
    if (netname !== null) {
      netsToHandler[netname] = handler;
    }
    if ((filter || reflookup) && first) {
      handler();
      first = false;
    }
  }
  EventHandler.emitEvent(
    IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT,
    {
      filter: filter,
      reflookup: reflookup,
      checkboxes: settings.checkboxes,
      bommode: settings.bommode,
    });
}

function highlightPreviousRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[highlightHandlers.length - 1].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[0].id == currentHighlightedRowId) {
      highlightHandlers[highlightHandlers.length - 1].handler();
    } else {
      for (var i = 0; i < highlightHandlers.length - 1; i++) {
        if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function highlightNextRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[0].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
      highlightHandlers[0].handler();
    } else {
      for (var i = 1; i < highlightHandlers.length; i++) {
        if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function populateBomTable() {
  populateBomHeader();
  populateBomBody();
}

function footprintsClicked(footprintIndexes) {
  var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
  for (var i = 1; i <= footprintIndexes.length; i++) {
    var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
    if (refIndex in footprintIndexToHandler) {
      lastClicked = refIndex;
      footprintIndexToHandler[refIndex]();
      smoothScrollToRow(currentHighlightedRowId);
      break;
    }
  }
}

function netClicked(net) {
  if (net in netsToHandler) {
    netsToHandler[net]();
    smoothScrollToRow(currentHighlightedRowId);
  } else {
    clearHighlightedFootprints();
    highlightedNet = net;
    drawHighlights();
  }
}

function updateFilter(input) {
  filter = input.toLowerCase();
  populateBomTable();
}

function updateRefLookup(input) {
  reflookup = input.toLowerCase();
  populateBomTable();
}

function changeCanvasLayout(layout) {
  document.getElementById("fl-btn").classList.remove("depressed");
  document.getElementById("fb-btn").classList.remove("depressed");
  document.getElementById("bl-btn").classList.remove("depressed");
  switch (layout) {
    case 'F':
      document.getElementById("fl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(1);
      }
      break;
    case 'B':
      document.getElementById("bl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(0);
      }
      break;
    default:
      document.getElementById("fb-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.setSizes([50, 50]);
      }
  }
  settings.canvaslayout = layout;
  writeStorage("canvaslayout", layout);
  resizeAll();
  changeBomMode(settings.bommode);
}

function populateMetadata() {
  document.getElementById("title").innerHTML = pcbdata.metadata.title;
  document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
  document.getElementById("company").innerHTML = pcbdata.metadata.company;
  document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
  if (pcbdata.metadata.title != "") {
    document.title = pcbdata.metadata.title + " BOM";
  }
  // Calculate board stats
  var fp_f = 0, fp_b = 0, pads_f = 0, pads_b = 0, pads_th = 0;
  for (var i = 0; i < pcbdata.footprints.length; i++) {
    if (pcbdata.bom.skipped.includes(i)) continue;
    var mod = pcbdata.footprints[i];
    if (mod.layer == "F") {
      fp_f++;
    } else {
      fp_b++;
    }
    for (var pad of mod.pads) {
      if (pad.type == "th") {
        pads_th++;
      } else {
        if (pad.layers.includes("F")) {
          pads_f++;
        }
        if (pad.layers.includes("B")) {
          pads_b++;
        }
      }
    }
  }
  document.getElementById("stats-components-front").innerHTML = fp_f;
  document.getElementById("stats-components-back").innerHTML = fp_b;
  document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
  document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
  document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
  document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
  document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
  document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
  document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
  document.getElementById("stats-th-pads").innerHTML = pads_th;
  // Update version string
  document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
    /^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}

function changeBomLayout(layout) {
  document.getElementById("bom-btn").classList.remove("depressed");
  document.getElementById("lr-btn").classList.remove("depressed");
  document.getElementById("tb-btn").classList.remove("depressed");
  switch (layout) {
    case 'bom-only':
      document.getElementById("bom-btn").classList.add("depressed");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      document.getElementById("frontcanvas").style.display = "none";
      document.getElementById("backcanvas").style.display = "none";
      document.getElementById("bot").style.height = "";
      break;
    case 'top-bottom':
      document.getElementById("tb-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("bot").style.height = "calc(100% - 80px)";
      document.getElementById("bomdiv").classList.remove("split-horizontal");
      document.getElementById("canvasdiv").classList.remove("split-horizontal");
      document.getElementById("frontcanvas").classList.add("split-horizontal");
      document.getElementById("backcanvas").classList.add("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        direction: "vertical",
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        onDragEnd: resizeAll
      });
      break;
    case 'left-right':
      document.getElementById("lr-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("bot").style.height = "calc(100% - 80px)";
      document.getElementById("bomdiv").classList.add("split-horizontal");
      document.getElementById("canvasdiv").classList.add("split-horizontal");
      document.getElementById("frontcanvas").classList.remove("split-horizontal");
      document.getElementById("backcanvas").classList.remove("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        direction: "vertical",
        onDragEnd: resizeAll
      });
  }
  settings.bomlayout = layout;
  writeStorage("bomlayout", layout);
  changeCanvasLayout(settings.canvaslayout);
}

function changeBomMode(mode) {
  document.getElementById("bom-grouped-btn").classList.remove("depressed");
  document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
  document.getElementById("bom-netlist-btn").classList.remove("depressed");
  switch (mode) {
    case 'grouped':
      document.getElementById("bom-grouped-btn").classList.add("depressed");
      break;
    case 'ungrouped':
      document.getElementById("bom-ungrouped-btn").classList.add("depressed");
      break;
    case 'netlist':
      document.getElementById("bom-netlist-btn").classList.add("depressed");
  }
  writeStorage("bommode", mode);
  if (mode != settings.bommode) {
    settings.bommode = mode;
    bomSortFunction = null;
    currentSortColumn = null;
    currentSortOrder = null;
    clearHighlightedFootprints();
  }
  populateBomTable();
}

function focusFilterField() {
  focusInputField(document.getElementById("filter"));
}

function focusRefLookupField() {
  focusInputField(document.getElementById("reflookup"));
}

function toggleBomCheckbox(bomrowid, checkboxnum) {
  if (!bomrowid || checkboxnum > settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
  checkbox.checked = !checkbox.checked;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function checkBomCheckbox(bomrowid, checkboxname) {
  var checkboxnum = 0;
  while (checkboxnum < settings.checkboxes.length &&
    settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
    checkboxnum++;
  }
  if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
  checkbox.checked = true;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function setBomCheckboxes(value) {
  writeStorage("bomCheckboxes", value);
  settings.checkboxes = value.split(",").filter((e) => e);
  prepCheckboxes();
  populateBomTable();
  populateDarkenWhenCheckedOptions();
}

function setDarkenWhenChecked(value) {
  writeStorage("darkenWhenChecked", value);
  settings.darkenWhenChecked = value;
  populateBomTable();
}

function prepCheckboxes() {
  var table = document.getElementById("checkbox-stats");
  while (table.childElementCount > 1) {
    table.removeChild(table.lastChild);
  }
  if (settings.checkboxes.length) {
    table.style.display = "";
  } else {
    table.style.display = "none";
  }
  for (var checkbox of settings.checkboxes) {
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    td.innerHTML = checkbox;
    tr.appendChild(td);
    td = document.createElement("TD");
    td.id = "checkbox-stats-" + checkbox;
    var progressbar = document.createElement("div");
    progressbar.classList.add("bar");
    td.appendChild(progressbar);
    var text = document.createElement("div");
    text.classList.add("text");
    td.appendChild(text);
    tr.appendChild(td);
    table.appendChild(tr);
    updateCheckboxStats(checkbox);
  }
}

function populateDarkenWhenCheckedOptions() {
  var container = document.getElementById("darkenWhenCheckedContainer");

  if (settings.checkboxes.length == 0) {
    container.parentElement.style.display = "none";
    return;
  }

  container.innerHTML = '';
  container.parentElement.style.display = "inline-block";

  function createOption(name, displayName) {
    var id = "darkenWhenChecked-" + name;

    var div = document.createElement("div");
    div.classList.add("radio-container");

    var input = document.createElement("input");
    input.type = "radio";
    input.name = "darkenWhenChecked";
    input.value = name;
    input.id = id;
    input.onchange = () => setDarkenWhenChecked(name);
    div.appendChild(input);

    // Preserve the selected element when the checkboxes change
    if (name == settings.darkenWhenChecked) {
      input.checked = true;
    }

    var label = document.createElement("label");
    label.innerHTML = displayName;
    label.htmlFor = id;
    div.appendChild(label);

    container.appendChild(div);
  }
  createOption("", "None");
  for (var checkbox of settings.checkboxes) {
    createOption(checkbox, checkbox);
  }
}

function updateCheckboxStats(checkbox) {
  var checked = getStoredCheckboxRefs(checkbox).size;
  var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
  var percent = checked * 100.0 / total;
  var td = document.getElementById("checkbox-stats-" + checkbox);
  td.firstChild.style.width = percent + "%";
  td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}

document.onkeydown = function(e) {
  switch (e.key) {
    case "n":
      if (document.activeElement.type == "text") {
        return;
      }
      if (currentHighlightedRowId !== null) {
        checkBomCheckbox(currentHighlightedRowId, "placed");
        highlightNextRow();
        e.preventDefault();
      }
      break;
    case "ArrowUp":
      highlightPreviousRow();
      e.preventDefault();
      break;
    case "ArrowDown":
      highlightNextRow();
      e.preventDefault();
      break;
    default:
      break;
  }
  if (e.altKey) {
    switch (e.key) {
      case "f":
        focusFilterField();
        e.preventDefault();
        break;
      case "r":
        focusRefLookupField();
        e.preventDefault();
        break;
      case "z":
        changeBomLayout("bom-only");
        e.preventDefault();
        break;
      case "x":
        changeBomLayout("left-right");
        e.preventDefault();
        break;
      case "c":
        changeBomLayout("top-bottom");
        e.preventDefault();
        break;
      case "v":
        changeCanvasLayout("F");
        e.preventDefault();
        break;
      case "b":
        changeCanvasLayout("FB");
        e.preventDefault();
        break;
      case "n":
        changeCanvasLayout("B");
        e.preventDefault();
        break;
      default:
        break;
    }
    if (e.key >= '1' && e.key <= '9') {
      toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
    }
  }
}

function hideNetlistButton() {
  document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
  document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
  document.getElementById("bom-netlist-btn").style.display = "none";
}

window.onload = function(e) {
  initUtils();
  initRender();
  initStorage();
  initDefaults();
  cleanGutters();
  populateMetadata();
  dbgdiv = document.getElementById("dbg");
  bom = document.getElementById("bombody");
  bomhead = document.getElementById("bomhead");
  filter = "";
  reflookup = "";
  if (!("nets" in pcbdata)) {
    hideNetlistButton();
  }
  initDone = true;
  prepCheckboxes();
  // Triggers render
  changeBomLayout(settings.bomlayout);

  // Users may leave fullscreen without touching the checkbox. Uncheck.
  document.addEventListener('fullscreenchange', () => {
    if (!document.fullscreenElement)
      document.getElementById('fullscreenCheckbox').checked = false;
  });
}

window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);

///////////////////////////////////////////////

///////////////////////////////////////////////
 
///////////////////////////////////////////////
  </script>
</head>

<body>
<!-- USERHEADER -->
<div id="topmostdiv" class="topmostdiv">
  <div id="top">
    <div style="float: right; height: 100%;">
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="menubtn"></button>
        <div class="menu-content">
          <label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
            <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
            Dark mode
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
            <input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
            Full Screen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
            Fab layer
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
            Silkscreen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
            References
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
            Values
          </label>
          <div id="tracksAndZonesCheckboxes">
            <label class="menu-label" style="width: calc(50% - 18px)">
              <input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
              Tracks
            </label><!-- This comment eats space! All of it!
            --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
              <input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
              Zones
            </label>
          </div>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
            Pads
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
            DNP outlined
          </label>
          <label class="menu-label">
            <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
            Highlight first pin
          </label>
          <label class="menu-label">
            <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
            Continuous redraw on drag
          </label>
          <label class="menu-label">
            <input id="crosshairCheckbox" type="checkbox" checked onchange="setShowCrosshair(this.checked)">
            Show Crosshair
          </label>
          <label class="menu-label">
            <span>Board rotation</span>
            <span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
            <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Bom checkboxes</div>
            <input id="bomCheckboxes" class="menu-textbox" type=text
                   oninput="setBomCheckboxes(this.value)">
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Darken when checked</div>
            <div id="darkenWhenCheckedContainer"></div>
          </label>
          <label class="menu-label">
            <span class="shameless-plug">
              <span>Created using</span>
              <a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
            </span>
          </label>
        </div>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
                title="Front only">F
        </button>
        <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
                title="Front and Back">FB
        </button>
        <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
                title="Back only">B
        </button>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
                title="BOM only"></button>
        <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
                title="BOM left, drawings right"></button>
        <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
                title="BOM top, drawings bot"></button>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
                title="Grouped BOM"></button>
        <button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
                title="Ungrouped BOM"></button>
        <button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
                title="Netlist"></button>
      </div>
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="statsbtn"></button>
        <div class="menu-content">
          <table class="stats">
            <tbody>
              <tr>
                <td width="40%">Board stats</td>
                <td>Front</td>
                <td>Back</td>
                <td>Total</td>
              </tr>
              <tr>
                <td>Components</td>
                <td id="stats-components-front">~</td>
                <td id="stats-components-back">~</td>
                <td id="stats-components-total">~</td>
              </tr>
              <tr>
                <td>Groups</td>
                <td id="stats-groups-front">~</td>
                <td id="stats-groups-back">~</td>
                <td id="stats-groups-total">~</td>
              </tr>
              <tr>
                <td>SMD pads</td>
                <td id="stats-smd-pads-front">~</td>
                <td id="stats-smd-pads-back">~</td>
                <td id="stats-smd-pads-total">~</td>
              </tr>
              <tr>
                <td>TH pads</td>
                <td colspan=3 id="stats-th-pads">~</td>
              </tr>
            </tbody>
          </table>
          <table class="stats">
            <col width="40%"/><col />
            <tbody id="checkbox-stats">
              <tr>
                <td colspan=2 style="border-top: 0">Checkboxes</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="iobtn"></button>
        <div class="menu-content">
          <div class="menu-label menu-label-top">
            <div style="margin-left: 5px;">Save board image</div>
            <div class="flexbox">
              <input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
              <span>X</span>
              <input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
            </div>
            <label>
              <input id="render-save-transparent" type="checkbox">
              Transparent background
            </label>
            <div class="flexbox">
              <button class="savebtn" onclick="saveImage('F')">Front</button>
              <button class="savebtn" onclick="saveImage('B')">Back</button>
            </div>
          </div>
          <div class="menu-label">
            <span style="margin-left: 5px;">Config and checkbox state</span>
            <div class="flexbox">
              <button class="savebtn" onclick="saveSettings()">Export</button>
              <button class="savebtn" onclick="loadSettings()">Import</button>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div id="fileinfodiv" style="overflow: auto;">
      <table class="fileinfo">
        <tbody>
          <tr>
            <td id="title" class="title" style="width: 70%">
              Title
            </td>
            <td id="revision" class="title" style="width: 30%">
              Revision
            </td>
          </tr>
          <tr>
            <td id="company">
              Company
            </td>
            <td id="filedate">
              Date
            </td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
  <div id="bot" class="split" style="height: calc(100% - 80px)">
    <div id="bomdiv" class="split split-horizontal">
      <div style="width: 100%">
        <input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
               oninput="updateRefLookup(this.value)">
        <input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
               oninput="updateFilter(this.value)">
        <div class="button-container hideonprint" style="float: left; margin: 0;">
          <button id="copy" title="Copy bom table to clipboard"
               onclick="copyToClipboard()"></button>
        </div>
      </div>
      <div id="dbg"></div>
      <table class="bom">
        <thead id="bomhead">
        </thead>
        <tbody id="bombody">
        </tbody>
      </table>
    </div>
    <div id="canvasdiv" class="split split-horizontal">
      <div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
      <div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
    </div>
  </div>
</div>
<!-- USERFOOTER -->
</body>

</html>
